<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.open-xchange.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tobias.friedrich</id>
	<title>Open-Xchange - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.open-xchange.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tobias.friedrich"/>
	<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Special:Contributions/Tobias.friedrich"/>
	<updated>2026-06-30T21:37:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:CardDAVClients&amp;diff=28013</id>
		<title>AppSuite:CardDAVClients</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:CardDAVClients&amp;diff=28013"/>
		<updated>2023-02-15T08:50:22Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Open-Xchange Contacts synchronization with CardDAV =&lt;br /&gt;
&lt;br /&gt;
This article is valid until the version 7.8.4 of the Open Xchange Server. &lt;br /&gt;
For newer versions, please visit https://documentation.open-xchange.com .&lt;br /&gt;
&lt;br /&gt;
This site describes how the Open-Xchange server can be accessed via its CardDAV interface after the server has been configured as described in [[Caldav_carddav_Bundles]]. Depending on the used client software, different steps are necessary. Other clients may be configured similarly, but are not officially supported.&lt;br /&gt;
&lt;br /&gt;
== Mac OS X Address Book / Contacts ==&lt;br /&gt;
&lt;br /&gt;
Depending on the used Mac OS X version, slightly different steps are necessary.&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X Contacts ===&lt;br /&gt;
{| &lt;br /&gt;
| [[image:carddav-account5.png|thumb]] || style=&amp;quot;width:85%&amp;quot; |&lt;br /&gt;
* Choose &amp;quot;Contacts&amp;quot; -&amp;gt; &amp;quot;Add Account...&amp;quot; from the Contacts App main Menu&lt;br /&gt;
* In the &amp;quot;Choose Contacts Account Provider...&amp;quot; Menu choose &amp;quot;Other Contacts Account...&amp;quot;&lt;br /&gt;
* In the &amp;quot;Add a Contacts Account&amp;quot; Menu choose &amp;quot;CardDAV&amp;quot; and &amp;quot;Account Type&amp;quot; &amp;quot;Manual&amp;quot;&lt;br /&gt;
* In the &amp;quot;User name&amp;quot; field enter your username&lt;br /&gt;
* In the &amp;quot;Password&amp;quot; field enter your password&lt;br /&gt;
* In the &amp;quot;Server address&amp;quot; field enter your server address '''with the prefix &amp;quot;dav.&amp;quot; (e.g. &amp;quot;dav.myserver.tld&amp;quot;)'''.&lt;br /&gt;
* Click &amp;quot;Sign In&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''PLEASE NOTE:''' For our product Open-Xchange Server Edition for UCS it isn't necessary to use &amp;quot;dav&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Debug Options ===&lt;br /&gt;
You can enable a Debug Menu inside the Address Book application which gives you access to advanced debugging and logging options. Please notice that some of these options may increase the size of the log files of your system and/or could also log sensitive data like passwords if enabled. Keep also in mind that any setting changed here will remain active until the setting itself will be reverted or changed again which means that disabling the Debug Menu itself is not sufficient to reset any debug settings to their defaults. All settings are case sensitive.&lt;br /&gt;
&lt;br /&gt;
Open a terminal window (Applications &amp;gt; Utilities &amp;gt; Terminal) and issue the following command for&lt;br /&gt;
* enabling the Debug Menu in the AddressBook:&lt;br /&gt;
 defaults write com.apple.AddressBook ABShowDebugMenu -bool true&lt;br /&gt;
* disabling the Debug Menu in the AddressBook:&lt;br /&gt;
 defaults write com.apple.AddressBook ABShowDebugMenu -bool false&lt;br /&gt;
&lt;br /&gt;
'''PLEASE NOTE:''': The debug menu is not available in Mac OS X 10.8.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== iOS Contacts ==&lt;br /&gt;
&lt;br /&gt;
The iOS Contacts application on the iPhone, iPod or iPad can be configured as follows.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:ios_carddav_config.png|thumb]] || style=&amp;quot;width:85%&amp;quot; |&lt;br /&gt;
* Open &amp;quot;Settings&amp;quot;&lt;br /&gt;
* Select &amp;quot;Mail, Contacts, Calendars&amp;quot; -&amp;gt; &amp;quot;Add Account...&amp;quot; -&amp;gt; &amp;quot;Other&amp;quot; -&amp;gt; &amp;quot;Add CardDAV Account&amp;quot;&lt;br /&gt;
* Enter the server address, username as password as shown in the screenshot&lt;br /&gt;
* Click &amp;quot;Next&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''PLEASE NOTE:''' For our product Open-Xchange Server Edition for UCS it isn't necessary to use &amp;quot;dav&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General Limitations ==&lt;br /&gt;
Please consider the following known limitations for the CardDAV interface:&lt;br /&gt;
&lt;br /&gt;
=== Unsupported Properties ===&lt;br /&gt;
* Importing or exporting file attachments (property &amp;quot;ATTACH&amp;quot;) is not supported via the CardDAV interface.&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;br /&gt;
[[Category: User]]&lt;br /&gt;
[[Category: Clients]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:CalDAVClients&amp;diff=28010</id>
		<title>AppSuite:CalDAVClients</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:CalDAVClients&amp;diff=28010"/>
		<updated>2023-02-15T08:49:40Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Open-Xchange Calendar synchronization with CalDAV =&lt;br /&gt;
&lt;br /&gt;
This article is valid until the version 7.8.4 of the Open Xchange Server. &lt;br /&gt;
For newer versions, please visit https://documentation.open-xchange.com .&lt;br /&gt;
&lt;br /&gt;
This site describes how the Open-Xchange server can be accessed via its CalDAV interface after the server has been configured as described in [[AppSuite:Caldav_carddav_Bundles]]. Depending on the used client software, different steps are necessary. Other clients may be configured similarly, but are not officially supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mac OS X iCal / Calendar ==&lt;br /&gt;
&lt;br /&gt;
The Calendar (previously known as iCal) application on Mac OS X can be configured as follows.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:caldav-account4.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Click the &amp;quot;+&amp;quot; sign in Calendar -&amp;gt; Preferences -&amp;gt; Accounts&lt;br /&gt;
* As &amp;quot;Account type&amp;quot; select &amp;quot;CalDAV&amp;quot;&lt;br /&gt;
* In the &amp;quot;User name&amp;quot; field enter your username&lt;br /&gt;
* In the &amp;quot;Password&amp;quot; field enter your password&lt;br /&gt;
* In the &amp;quot;Server address&amp;quot; field enter your server address '''with the prefix &amp;quot;dav.&amp;quot; and a slash as suffix (e.g. &amp;quot;dav.MYSERVER.TLD/&amp;quot;)''' &lt;br /&gt;
* Click &amp;quot;Create&amp;quot;&lt;br /&gt;
* Click &amp;quot;Continue&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''PLEASE NOTE:''' For our product Server Edition for UCS it isn't necessary to use &amp;quot;dav&amp;quot;. Other &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== iOS Calendar ==&lt;br /&gt;
&lt;br /&gt;
The iOS Calendar application on the iPhone, iPod or iPad can be configured as follows.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:ios_caldav_config.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Open &amp;quot;Settings&amp;quot;&lt;br /&gt;
* Select &amp;quot;Mail, Contacts, Calendars&amp;quot; -&amp;gt; &amp;quot;Add Account...&amp;quot; -&amp;gt; &amp;quot;Other&amp;quot; -&amp;gt; &amp;quot;Add CalDAV Account&amp;quot;&lt;br /&gt;
* Enter the server address, username as password as shown in the screenshot&lt;br /&gt;
* Click &amp;quot;Next&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''PLEASE NOTE:''' For our product Open-Xchange Server Edition for UCS it isn't necessary to use &amp;quot;dav&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Thunderbird/Lightning ==&lt;br /&gt;
&lt;br /&gt;
The steps below describe how to setup the Mozilla Thunderbird client with the Lightning Add-on. &lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
Please ensure that the following preconditions are met before continuing:&lt;br /&gt;
* Latest versions of the Mozilla Thunderbird E-Mail client and the Lightning Add-on (check https://addons.mozilla.org/thunderbird/addon/lightning/ and http://www.mozilla.org/thunderbird/ for details)&lt;br /&gt;
* In the Mozilla Thunderbird client, an E-Mail account for the user's Open-Xchange mailbox needs to be setup before configuring the CalDAV access&lt;br /&gt;
&lt;br /&gt;
=== Discover the CalDAV URL of your Calendar Folders ===&lt;br /&gt;
In contrast to some other clients, Thunderbird/Lightning is not able to discover all the available calendar collections automatically. Instead, each calendar folder needs to be added seperately in the client. To do so, one needs to know the CalDAV URLs of the calendar folder that should be synchronized with the client. This URL is displayed in the properties-page in the Groupware web-interface.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:CalDAV_URL_Step1.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Open a webbrowser and login to the groupware web-interface&lt;br /&gt;
* From the folder tree, open the context menu of a calendar folder and select &amp;quot;Properties&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[image:CalDAV_URL_Step2.png|thumb]] ||&lt;br /&gt;
* The CalDAV URL is shown in the content area. Note down the URL or copy it to the clipboard.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Add a Calendar in Thunderbird/Lightning ===&lt;br /&gt;
As already mentioned, each Calendar folder that should be sychronized has to be added separately in the client. The following steps show how to add a Calendar in Thunderbird/Lightning. Before starting, ensure that the client is connected to the network and the server can be accessed.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:LightningSetup_Step1.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Select &amp;quot;Events and Tasks&amp;quot; -&amp;gt; &amp;quot;Calendar&amp;quot; from the menu bar to switch to the Calendar view&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step2.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* From the menu bar, select &amp;quot;File&amp;quot; -&amp;gt; &amp;quot;New&amp;quot; -&amp;gt; &amp;quot;Calendar...&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step3.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* In the popup window, select &amp;quot;On the network&amp;quot; and click &amp;quot;Next &amp;gt;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step4.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* As format, select &amp;quot;CalDAV&amp;quot;&lt;br /&gt;
* Enter the CalDAV path as reported by the folder's properties page (see above) as location&lt;br /&gt;
* For offline access, check the &amp;quot;Cache&amp;quot; checkbox &lt;br /&gt;
* Click &amp;quot;Next &amp;gt;&amp;quot; to continue&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step5.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Enter a name for the Calendar and assign a color if you like &lt;br /&gt;
* Select whether reminders should be shown or not&lt;br /&gt;
* Select the E-Mail account belonging to the Calendar user from the list &lt;br /&gt;
* Click &amp;quot;Next &amp;gt;&amp;quot; to create the Calendar &lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step6.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* When requested, enter your username and password for the server&lt;br /&gt;
* Afterwards, the Calendar setup is complete and the contents are synchronized&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Debug Options ===&lt;br /&gt;
In case of synchronization problems, the built-in error console of Mozilla Thunderbird may provide valuable information. The error console can be opened via &amp;quot;Tools&amp;quot; -&amp;gt; &amp;quot;Error Console&amp;quot;. To increase the loglevel of the Lightning Add-on, open the config editor by selecting &amp;quot;Tools&amp;quot; -&amp;gt; &amp;quot;Options...&amp;quot; -&amp;gt; &amp;quot;Advanced&amp;quot; -&amp;gt; &amp;quot;Config Editor...&amp;quot; and set the properties &amp;quot;calendar.debug.log&amp;quot; and &amp;quot;calendar.debug.log.verbose&amp;quot; to &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General Limitations ==&lt;br /&gt;
Please consider the following known limitations for the CalDAV interface:&lt;br /&gt;
&lt;br /&gt;
=== Reminders ===&lt;br /&gt;
* While the iCalendar standard allows to set appointment reminders past due an appointment's start-date, the OX server is not able to save such alarm times and discards them.&lt;br /&gt;
* Multiple reminders in an event are not supported by the OX server and are discarded.&lt;br /&gt;
* Only reminders of type &amp;quot;DISPLAY&amp;quot; are supported by the OX server, reminders of other iCal types are discarded.&lt;br /&gt;
* When dismissing reminders of recurring appointments in the Mozilla Lightning client, the reminder is removed from the whole recurring appointment object, since it's not possible to determine to which occurrence the dismiss action belongs to.&lt;br /&gt;
&lt;br /&gt;
=== Unsupported Properties ===&lt;br /&gt;
* The &amp;quot;URL&amp;quot; property for iCal resources is not supported by the OX server and is discarded.&lt;br /&gt;
* Importing or exporting file attachments (property &amp;quot;ATTACH&amp;quot;) is not supported via the CalDAV interface.&lt;br /&gt;
&lt;br /&gt;
=== Private Appointments ===&lt;br /&gt;
* Appointments classified as &amp;quot;private&amp;quot; are exported by the server with the &amp;quot;CLASS&amp;quot; property set to &amp;quot;PRIVATE&amp;quot;.&lt;br /&gt;
* iCal events with the &amp;quot;CLASS&amp;quot; property set to either &amp;quot;CONFIDENTIAL&amp;quot; or &amp;quot;PRIVATE&amp;quot; are treated in the same way by the server and are imported as &amp;quot;private&amp;quot; appointments.&lt;br /&gt;
* Since &amp;quot;private&amp;quot; appointments with participants are not supported by the server, saving such an appointment results in the participants being removed implicitly during import.&lt;br /&gt;
&lt;br /&gt;
=== Tasks ===&lt;br /&gt;
* Only simple tasks (no participants, no recurrence) are supported.&lt;br /&gt;
* Only the properties &amp;quot;DTSTART&amp;quot;, &amp;quot;DUE&amp;quot;, &amp;quot;CATEGORIES&amp;quot;, &amp;quot;SUMMARY&amp;quot;, &amp;quot;PRIORITY&amp;quot;, &amp;quot;DESCRIPTION&amp;quot;, &amp;quot;VALARM&amp;quot;, &amp;quot;STATUS&amp;quot;, &amp;quot;PERCENT-COMPLETE&amp;quot; and &amp;quot;COMPLETED&amp;quot; are synchronized, other ones are discarded by the server.&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:VCardMapping&amp;diff=25684</id>
		<title>AppSuite:VCardMapping</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:VCardMapping&amp;diff=25684"/>
		<updated>2021-01-13T16:21:04Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Open-Xchange Contact to vCard Mapping&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This article is valid until the version 7.10.4 of the Open Xchange Server. For newer versions please visit&lt;br /&gt;
https://documentation.open-xchange.com/index.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
This article describes the mapping rules that are used when converting contacts to or from vCards using the Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
In former releases of the Open-Xchange Server, when a contact was imported from a vCard, the server only stored vCard parameter values that could be mapped to internal OX properties of a contact, and ignored all further unknown or not mappable properties. Especially during CardDAV synchronization, this often led to partial data loss after the client fetched a previously imported vCard again from the server, for example if the client tried to save a third instant messenger property, a geographical location, or the PGP public key of the contact.&lt;br /&gt;
&lt;br /&gt;
To circumvent these kinds of problems, the vCard import- and export-workflow was redesigned, and now allows to store the original vCard as well besides the mappable contact properties. If enabled, the original data as sent by the client is stored automatically in the context filestore, and is considered again during export in a way where any updates to the OX contact are merged back into the original vCard.&lt;br /&gt;
&lt;br /&gt;
To support the described merging process, the mapping between OX contact attributes and vCard properties has been slightly adjusted to allow a deterministic conversion in both directions. Additionally, all OX contact attributes that are not covered by a well-known vCard property are exported as extended properties, so that all OX properties in an exported vCard are recognized correctly again during import. Further details about the mapping are documented in [[#Mapping_Rules|Mapping Rules]] below.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Whether original vCards should be stored or not, as well as their maximum allowed size, can be controlled by some new properties in the configuration file &amp;lt;code&amp;gt;contact.properties&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # Specifies whether the original files are persisted during vCard import or &lt;br /&gt;
 # CardDAV synchronization. If enabled, the original vCard files will be stored &lt;br /&gt;
 # in the appropriate filestore and are considered during export again. If &lt;br /&gt;
 # disabled, all not mapped information is discarded and is no longer available &lt;br /&gt;
 # when exporting the vCard again. &lt;br /&gt;
 # Defaults to &amp;quot;true&amp;quot;. &lt;br /&gt;
 com.openexchange.contact.storeVCards=true &lt;br /&gt;
 &lt;br /&gt;
 # Configures the maximum allowed size of a (single) vCard file in bytes. &lt;br /&gt;
 # vCards larger than the configured maximum size are rejected and not parsed &lt;br /&gt;
 # by the server. A value of &amp;quot;0&amp;quot; or smaller is considered as unlimited. &lt;br /&gt;
 # Defaults to 4194304. &lt;br /&gt;
 com.openexchange.contact.maxVCardSize=4194304 &lt;br /&gt;
&lt;br /&gt;
Please note that storing the original vCard requires an attached filestore for the context, so in case there is none (as indicated via &amp;lt;code&amp;gt;com.openexchange.capability.filestore=false&amp;lt;/code&amp;gt;), this feature is not available - importing and exporting vCards then works much like before, i.e. no original vCard is saved, and only mappable properties are persisted.&lt;br /&gt;
&lt;br /&gt;
== Workflows ==&lt;br /&gt;
&lt;br /&gt;
When importing and exporting contacts to or from vCard, there are basically two operation modes: On the one hand, the independent import or export of a contact to or from a vCard, and on the other hand, the process of merging contact updates into an original vCard (or the other way around, merging updated vCards into contacts).&lt;br /&gt;
&lt;br /&gt;
While the first one is mainly used for one-time import-/export-purposes, the latter one is performed during a continuous synchronization of contacts as done via CardDAV, yet also a one-time export will pick up and merge with an existing vCard in case it exists. So, importing and exporting basically involves the following steps:    &lt;br /&gt;
&lt;br /&gt;
* Export a contact with no original vCard:&lt;br /&gt;
** Start with a blank vCard&lt;br /&gt;
** Write all mapped OX properties into the vCard based on the mapping rules below&lt;br /&gt;
&lt;br /&gt;
* Export a contact with an original vCard:&lt;br /&gt;
** Load the stored vCard&lt;br /&gt;
** Merge all mapped OX properties into the vCard based on the mapping rules below&lt;br /&gt;
&lt;br /&gt;
* Import a vCard and create a new contact:&lt;br /&gt;
** Create a new contact&lt;br /&gt;
** Parse all mapped properties based on the mapping rules below&lt;br /&gt;
** Additionally, store the original vCard&lt;br /&gt;
&lt;br /&gt;
* Import a vCard and update an existing contact:&lt;br /&gt;
** Load the stored contact&lt;br /&gt;
** Parse all mapped properties based on the mapping rules below&lt;br /&gt;
** Store or overwrite a previously stored original vCard&lt;br /&gt;
&lt;br /&gt;
== Mapping Rules ==&lt;br /&gt;
&lt;br /&gt;
Mapping between known OX contact attributes and vCard attributes is based on the following rules, where some of the mappings are simple and direct, while others are bit more complicated due to their different representations in the underlying data models. &lt;br /&gt;
&lt;br /&gt;
=== Simple Mappings ===&lt;br /&gt;
&lt;br /&gt;
Simple mappings refer to properties where some kind of direct mapping between OX contact attributes and vCard attributes exist. Since many properties in vCards can be defined more than once, the mapping uses the most preferred (based on the PREF type parameter) or first property in the vCard. The following list gives an overview about the directly mapped, simple properties:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SimpleMappings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Simple Mappings&lt;br /&gt;
! OX column ID !! OX attribute name !! vCard property !! Remarks&lt;br /&gt;
|-&lt;br /&gt;
|          517 ||       anniversary ||    ANNIVERSARY ||        &lt;br /&gt;
|-&lt;br /&gt;
|          511 ||          birthday ||           BDAY ||        &lt;br /&gt;
|-&lt;br /&gt;
|          100 ||        categories ||     CATEGORIES ||        &lt;br /&gt;
|-&lt;br /&gt;
|          101 ||      private_flag ||          CLASS || Only exported if &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|          500 ||      display_name ||             FN ||        &lt;br /&gt;
|-&lt;br /&gt;
|          515 ||          nickname ||       NICKNAME ||        &lt;br /&gt;
|-&lt;br /&gt;
|          518 ||              note ||           NOTE ||        &lt;br /&gt;
|-&lt;br /&gt;
|          570 ||            image1 ||          PHOTO ||        &lt;br /&gt;
|-&lt;br /&gt;
|          515 ||          nickname ||       NICKNAME ||        &lt;br /&gt;
|-&lt;br /&gt;
|            5 ||     last_modified ||            REV || Ignored during import&lt;br /&gt;
|-&lt;br /&gt;
|          520 ||          position ||          TITLE ||        &lt;br /&gt;
|-&lt;br /&gt;
|          514 ||        profession ||           ROLE ||        &lt;br /&gt;
|-&lt;br /&gt;
|          223 ||               uid ||            UID ||        &lt;br /&gt;
|-&lt;br /&gt;
|          558 ||               url ||            URL ||        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Extended Mappings ===&lt;br /&gt;
&lt;br /&gt;
Besides the mappings where a direct property mapping is possible, there are some more mappings from OX contact fields to other well-known vCard properties or custom extended properties:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedMappings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended Mappings&lt;br /&gt;
! OX column ID !! OX attribute name !! vCard property !! Remarks&lt;br /&gt;
|-&lt;br /&gt;
|          537 ||    assistant_name ||             X-ASSISTANT || Additional fallbacks to X-MS-ASSISTANT, X-KADDRESSBOOK-X-AssistantsName, X-EVOLUTION-ASSISTANT&lt;br /&gt;
|-&lt;br /&gt;
|          536 ||      manager_name ||               X-MANAGER || Additional fallbacks to X-MS-MANAGER, X-KADDRESSBOOK-X-ManagersName, X-EVOLUTION-MANAGER&lt;br /&gt;
|-&lt;br /&gt;
|          516 ||       spouse_name ||                X-SPOUSE || Additional fallbacks to X-MS-SPOUSE, X-KADDRESSBOOK-X-SpouseName, X-EVOLUTION-SPOUSE&lt;br /&gt;
|-&lt;br /&gt;
|          513 || number_of_children ||              X-MS-CHILD ||        &lt;br /&gt;
|-&lt;br /&gt;
|          616 ||   yomi_first_name ||   X-PHONETIC-FIRST-NAME ||        &lt;br /&gt;
|-&lt;br /&gt;
|          617 ||    yomi_last_name ||    X-PHONETIC-LAST-NAME ||        &lt;br /&gt;
|-&lt;br /&gt;
|          571 ||       userfield01 ||       X-OX-USERFIELD-01 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          572 ||       userfield02 ||       X-OX-USERFIELD-02 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          573 ||       userfield03 ||       X-OX-USERFIELD-03 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          574 ||       userfield04 ||       X-OX-USERFIELD-04 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          575 ||       userfield05 ||       X-OX-USERFIELD-05 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          576 ||       userfield06 ||       X-OX-USERFIELD-06 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          577 ||       userfield07 ||       X-OX-USERFIELD-07 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          578 ||       userfield08 ||       X-OX-USERFIELD-08 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          579 ||       userfield09 ||       X-OX-USERFIELD-09 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          580 ||       userfield10 ||       X-OX-USERFIELD-10 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          581 ||       userfield11 ||       X-OX-USERFIELD-11 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          582 ||       userfield12 ||       X-OX-USERFIELD-12 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          583 ||       userfield13 ||       X-OX-USERFIELD-13 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          584 ||       userfield14 ||       X-OX-USERFIELD-14 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          585 ||       userfield15 ||       X-OX-USERFIELD-15 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          586 ||       userfield16 ||       X-OX-USERFIELD-16 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          587 ||       userfield17 ||       X-OX-USERFIELD-17 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          588 ||       userfield18 ||       X-OX-USERFIELD-18 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          589 ||       userfield19 ||       X-OX-USERFIELD-19 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          590 ||       userfield20 ||       X-OX-USERFIELD-20 ||        &lt;br /&gt;
|-&lt;br /&gt;
|          522 ||       room_number ||        X-OX-ROOM-NUMBER ||        &lt;br /&gt;
|-&lt;br /&gt;
|          535 ||              info ||               X-OX-INFO ||        &lt;br /&gt;
|-&lt;br /&gt;
|          529 || number_of_employee || X-OX-NUMBER-OF-EMPLOYEE ||        &lt;br /&gt;
|-&lt;br /&gt;
|          534 || business_category ||  X-OX-BUSINESS-CATEGORY ||        &lt;br /&gt;
|-&lt;br /&gt;
|          532 || commercial_register|X-OX-COMMERCIAL-REGISTER ||        &lt;br /&gt;
|-&lt;br /&gt;
|          531 ||            tax_id ||             X-OX-TAX-ID ||        &lt;br /&gt;
|-&lt;br /&gt;
|          530 ||      sales_volume ||       X-OX-SALES-VOLUME ||        &lt;br /&gt;
|-&lt;br /&gt;
|          521 ||     employee_type ||      X-OX-EMPLOYEE-TYPE ||        &lt;br /&gt;
|-&lt;br /&gt;
|          512 ||    marital_status ||     X-OX-MARITAL-STATUS ||        &lt;br /&gt;
|-&lt;br /&gt;
|          618 ||      yomi_company ||       X-OX-YOMI-COMPANY ||        &lt;br /&gt;
|-&lt;br /&gt;
|          102 ||       color_label ||        X-OX-COLOR-LABEL ||        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Advanced mappings ===&lt;br /&gt;
&lt;br /&gt;
Apart from the simple mappings above, there are also more complex vCard properties that refer to or are influenced by more than one OX contact property.&lt;br /&gt;
&lt;br /&gt;
==== Addresses ====&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc6350#section-6.3.1 &lt;br /&gt;
* OX contacts have three address types: &amp;lt;tt&amp;gt;business&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and and &amp;lt;tt&amp;gt;other&amp;lt;/tt&amp;gt;&lt;br /&gt;
* For each, OX stores the properties &amp;lt;tt&amp;gt;street&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;city&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;state&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;postal code&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;country&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Additionally, the mailing label for snail mail (as set by some Outlook clients) is held in &amp;lt;tt&amp;gt;addressHome&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;addressBusiness&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;addressOther&amp;lt;/tt&amp;gt; &lt;br /&gt;
* In vCards, &amp;lt;tt&amp;gt;ADR&amp;lt;/tt&amp;gt; properties have the cardinality &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, and may have an assigned &amp;lt;tt&amp;gt;LABEL&amp;lt;/tt&amp;gt; for the mailing label&lt;br /&gt;
* Each one is stored as structured value (&amp;lt;tt&amp;gt;post office box&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;extended address&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;street address&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;locality&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;region&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;postal code&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;country name&amp;lt;/tt&amp;gt;)&lt;br /&gt;
* The address parts are mapped between OX contacts and vCards as follows:&lt;br /&gt;
** &amp;lt;tt&amp;gt;street&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;street address&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;city&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;locality&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;state&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;region&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;postal code&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;postal code&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;country&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;country name&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;address&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;LABEL&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Hence, there are no corresponding OX fields for &amp;lt;tt&amp;gt;post office box&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;extended address&amp;lt;/tt&amp;gt;&lt;br /&gt;
* During import, the mapping to vCard &amp;lt;tt&amp;gt;ADR&amp;lt;/tt&amp;gt; properties is based on the &amp;lt;tt&amp;gt;TYPE&amp;lt;/tt&amp;gt; parameters and follows the following rules:&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;business&amp;lt;/tt&amp;gt; address, the first &amp;lt;tt&amp;gt;ADR&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the first with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, delete the corresponding OX address properties&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; address, the first &amp;lt;tt&amp;gt;ADR&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the first with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, delete the corresponding OX address properties&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;other&amp;lt;/tt&amp;gt; address, the first &amp;lt;tt&amp;gt;ADR&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the first with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, parse the first without type parameters &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt;  &amp;lt;br /&amp;gt;if not found, delete the corresponding OX address properties&lt;br /&gt;
* During export, the OX contact addresses are serialized to a previously saved original vCard as follows:&lt;br /&gt;
** Generally, if no single OX property that forms a specific address is set anymore, the corresponding vCard property is deleted during the update&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;business&amp;lt;/tt&amp;gt; address, the first &amp;lt;tt&amp;gt;ADR&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the first property with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and add the &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; type &amp;lt;br /&amp;gt;if not found, add a new property with types &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; address, the first &amp;lt;tt&amp;gt;ADR&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the first property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, add a new property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;other&amp;lt;/tt&amp;gt; address, the first &amp;lt;tt&amp;gt;ADR&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the first property with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, update the first property without types &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and add the &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; type &amp;lt;br /&amp;gt;if not found, add a new property with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== E-Mails ====&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc6350#section-6.4.2&lt;br /&gt;
* OX contacts allow storing three different e-mail addresses: &amp;lt;tt&amp;gt;email1&amp;lt;/tt&amp;gt; (~business), &amp;lt;tt&amp;gt;email2&amp;lt;/tt&amp;gt; (~home) and &amp;lt;tt&amp;gt;email3&amp;lt;/tt&amp;gt; (~other)&lt;br /&gt;
* A &amp;lt;tt&amp;gt;telex&amp;lt;/tt&amp;gt; address is stored at &amp;lt;tt&amp;gt;telephone_telex&amp;lt;/tt&amp;gt; in OX contacts, yet it is expressed as &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; type in vCards    &lt;br /&gt;
* In vCards, &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; properties have the cardinality *&lt;br /&gt;
* During import, the mapping to vCard &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; properties is based on the &amp;lt;tt&amp;gt;TYPE&amp;lt;/tt&amp;gt; parameters and follows the following rules:&lt;br /&gt;
** Generally, if no matching vCard &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property is found, the corresponding OX email property is deleted&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;business&amp;lt;/tt&amp;gt; mail address, the first &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the first with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, and all &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; properties have no distinguishing type (i.e. none is marked &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;TLX&amp;lt;/tt&amp;gt;), parse the most preferred one&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; mail address, the first &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the first with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, and all &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; properties have no distinguishing type (i.e. none is marked &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;TLX&amp;lt;/tt&amp;gt;), parse the 2nd most preferred one&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;other&amp;lt;/tt&amp;gt; mail address, the first &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the first with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, parse the &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property that is grouped with an &amp;lt;tt&amp;gt;X-ABLabel&amp;lt;/tt&amp;gt; with value &amp;lt;tt&amp;gt;_$!&amp;lt;Other&amp;gt;!$_&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, parse the first without type parameter &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;TLX&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, and all &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; properties have no distinguishing type (i.e. none is marked &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;TLX&amp;lt;/tt&amp;gt;), parse the 3rd most preferred one&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telex&amp;lt;/tt&amp;gt; address, the first &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;TLX&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the first with type &amp;lt;tt&amp;gt;TLX&amp;lt;/tt&amp;gt;&lt;br /&gt;
* During export, the OX contact mail addresses are serialized to a previously saved original vCard as follows:&lt;br /&gt;
** Generally, if no single OX property that forms a specific email is set anymore, the corresponding vCard property is deleted during the update&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;business&amp;lt;/tt&amp;gt; mail address, the first &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the first with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and add the &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; type &amp;lt;br /&amp;gt;if not found, and all &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; properties have no distinguishing type (i.e. none is marked &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;TLX&amp;lt;/tt&amp;gt;), update the most preferred one  and add the &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; type &amp;lt;br /&amp;gt;if not found, add a new property with types &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; mail address, the first &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the first with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, and all &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; properties have no distinguishing type (i.e. none is marked &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;TLX&amp;lt;/tt&amp;gt;), update the 2nd most preferred one and add the &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; type &amp;lt;br /&amp;gt;if not found, add a new property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;other&amp;lt;/tt&amp;gt; mail address, the first &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the first with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, update the &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property that is grouped with an &amp;lt;tt&amp;gt;X-ABLabel&amp;lt;/tt&amp;gt; with value &amp;lt;tt&amp;gt;_$!&amp;lt;Other&amp;gt;!$_&amp;lt;/tt&amp;gt; and add the &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; type &amp;lt;br /&amp;gt;if not found, and all &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; properties have no distinguishing type (i.e. none is marked &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;TLX&amp;lt;/tt&amp;gt;), update the 3rd most preferred one and add the &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; type &amp;lt;br /&amp;gt;if not found, add a new property with types &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telex&amp;lt;/tt&amp;gt; address, the first &amp;lt;tt&amp;gt;EMAIL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;tlx&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the first with type &amp;lt;tt&amp;gt;tlx&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, add a new property with type &amp;lt;tt&amp;gt;tlx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Instant Messenger ====&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc6350#section-6.4.3&lt;br /&gt;
* OX contacts allow to store two IM addresses: &amp;lt;tt&amp;gt;instant_messenger1&amp;lt;/tt&amp;gt; (~business), &amp;lt;tt&amp;gt;instant_messenger2&amp;lt;/tt&amp;gt; (~home)&lt;br /&gt;
* OX contacts store IM addresses as arbitrary strings, there are no special protocol semantics applied&lt;br /&gt;
* In vCards, IMPP properties have the cardinality *&lt;br /&gt;
* In vCards, an instant messenger addresses are formed as URI, where the protocol part indicate the messenger type (such as 'aim' or 'irc') &lt;br /&gt;
* During import, the mapping to vCard &amp;lt;tt&amp;gt;IMPP&amp;lt;/tt&amp;gt; properties is based on the &amp;lt;tt&amp;gt;TYPE&amp;lt;/tt&amp;gt; parameters and follows the following rules:&lt;br /&gt;
** The whole URI string is stored during import  &lt;br /&gt;
** Generally, if no matching vCard &amp;lt;tt&amp;gt;IMPP&amp;lt;/tt&amp;gt; property is found, the corresponding OX instant messenger properties are deleted&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;business&amp;lt;/tt&amp;gt; IM address, the first &amp;lt;tt&amp;gt;IMPP&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the first with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; IM address, the first &amp;lt;tt&amp;gt;IMPP&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the first with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, parse the first without type parameter&lt;br /&gt;
* During export, the OX contact IM addresses are serialized to a previously saved original vCard as follows:&lt;br /&gt;
** If the stored value represents a URI, this URI is used directly, otherwise, a synthetic URI is constructed    &lt;br /&gt;
** Generally, if no single OX property that forms a specific IM address is set anymore, the corresponding vCard property is deleted during the update&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;business&amp;lt;/tt&amp;gt; IM address, the first &amp;lt;tt&amp;gt;IMPP&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the first with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and add the &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; type &amp;lt;br /&amp;gt;if not found, add a new property with types &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; IM address, the first &amp;lt;tt&amp;gt;IMPP&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the first with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, add a new property with types &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Organization ====&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc6350#section-6.6.4&lt;br /&gt;
* OX contacts store organizational attributes at &amp;lt;tt&amp;gt;company&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;department&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;branches&amp;lt;/tt&amp;gt;&lt;br /&gt;
* In vCards, the structured &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property holds the &amp;lt;tt&amp;gt;X.520 Organization Name and Organization Unit attributes [CCITT.X520.1988]&amp;lt;/tt&amp;gt;&lt;br /&gt;
* During import, the mapping to the vCard &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property is based on the following rules:&lt;br /&gt;
** The first value from the structured &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property is used as &amp;lt;tt&amp;gt;company&amp;lt;/tt&amp;gt;&lt;br /&gt;
** The second value from the structured &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property is used as &amp;lt;tt&amp;gt;department&amp;lt;/tt&amp;gt;&lt;br /&gt;
** All further values from the structured &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property are used as &amp;lt;tt&amp;gt;branches&amp;lt;/tt&amp;gt;&lt;br /&gt;
** If no &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property is found, all corresponding contact attributes are deleted, too&lt;br /&gt;
* During export, the OX contact's organizational attributes are serialized to a previously saved original vCard as follows:&lt;br /&gt;
** If no single OX property that forms the &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property is set anymore, the corresponding vCard property is deleted during the update&lt;br /&gt;
** The structured value is always rewritten&lt;br /&gt;
** The &amp;lt;tt&amp;gt;company&amp;lt;/tt&amp;gt; is used as first value of the structured value&lt;br /&gt;
** The &amp;lt;tt&amp;gt;department&amp;lt;/tt&amp;gt; is used as second value of the structured value&lt;br /&gt;
** The &amp;lt;tt&amp;gt;branches&amp;lt;/tt&amp;gt; are used as further values of the structured value&lt;br /&gt;
&lt;br /&gt;
==== Telephone ====&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc6350#section-6.4.1&lt;br /&gt;
* OX contacts store telephone and fax numbers at the fields &amp;lt;tt&amp;gt;telephone_business1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_business2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax_business&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_callback&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_car&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_company&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_home1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_home2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax_home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cellular_telephone1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cellular_telephone2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_other&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax_other&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_isdn&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_primary&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_radio&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_ttytdd&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_ip&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;telephone_assistant&amp;lt;/tt&amp;gt; &lt;br /&gt;
* In vCards, TEL properties have the cardinality *&lt;br /&gt;
* During import, the mapping from vCard &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; properties is based on the &amp;lt;tt&amp;gt;TYPE&amp;lt;/tt&amp;gt; parameters and follows the following rules:&lt;br /&gt;
** Generally, if no matching vCard &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property is found, the corresponding OX telephone properties are deleted&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_pager&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_ttytdd&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_isdn&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;isdn&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_car&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;car&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;cellular_telephone1&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;cellular_telephone2&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the second most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_callback&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-callback&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_company&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-company&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_assistant&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-assistant&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_ip&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-ip&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_radio&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-radio&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_primary&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-primary&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;fax_business&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;fax_home&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;fax_other&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_business1&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_business2&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, parse the second most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, parse the second most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_home1&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_home2&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; is parsed &amp;lt;br /&amp;gt;if not found, parse the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, parse the second most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, parse the second most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_other&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; is parsed&lt;br /&gt;
* During export, the OX contact telephone numbers are serialized to a previously saved original vCard as follows:&lt;br /&gt;
** Generally, if the OX telephone property is not set anymore, the corresponding vCard property is deleted during the update&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_pager&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_ttytdd&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_isdn&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;isdn&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;isdn&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_car&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;car&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;car&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;cellular_telephone1&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;cellular_telephone2&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, parse the update the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt; and add the type &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt;  &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_callback&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-callback&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-callback&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_company&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-company&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-company&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_assistant&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-assistant&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-assistant&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_ip&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-ip&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-ip&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_radio&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-radio&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-radio&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_primary&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-primary&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-primary&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;fax_business&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt; and `work&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;fax_home&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt;  &lt;br /&gt;
** For the &amp;lt;tt&amp;gt;fax_other&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_business1&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_business2&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, update the second most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and add the type &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, update the second most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; and add the type &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;work&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_home1&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt; and type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pref&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_home2&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, update the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, update the second most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and add the type &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, update the second most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and without any of the types &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;cell&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;video&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pager&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;textphone&amp;lt;/tt&amp;gt; and add the type &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt; &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-2nd&amp;lt;/tt&amp;gt;&lt;br /&gt;
** For the &amp;lt;tt&amp;gt;telephone_other&amp;lt;/tt&amp;gt; attribute, the most preferred &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with type &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt; is updated &amp;lt;br /&amp;gt;if not found, add a new &amp;lt;tt&amp;gt;TEL&amp;lt;/tt&amp;gt; property with types &amp;lt;tt&amp;gt;voice&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;x-other&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== (Structured) name ====&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc6350#section-6.2.2 &lt;br /&gt;
* OX contacts stores name-related properties at the fields: &amp;lt;tt&amp;gt;first_name&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;last_name&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;second_name&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;suffix&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;title&amp;lt;/tt&amp;gt; &lt;br /&gt;
* In vCards, the structured property &amp;lt;tt&amp;gt;N&amp;lt;/tt&amp;gt; stores the different parts of a name, which are &amp;lt;tt&amp;gt;family&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;given&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;additional&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;prefixes&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;suffixes&amp;lt;/tt&amp;gt;&lt;br /&gt;
* The parts are mapped between OX contacts and vCards as follows:&lt;br /&gt;
** &amp;lt;tt&amp;gt;last_name&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;family&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;first_name&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;given&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;second_name&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;additional&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;title&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;prefixes&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;suffix&amp;lt;/tt&amp;gt; &amp;lt;-&amp;gt; &amp;lt;tt&amp;gt;suffixes&amp;lt;/tt&amp;gt;&lt;br /&gt;
* During import, the mapping to the vCard &amp;lt;tt&amp;gt;N&amp;lt;/tt&amp;gt; property is based on the following rules:&lt;br /&gt;
** If there's no &amp;lt;tt&amp;gt;N&amp;lt;/tt&amp;gt; property in the vCard, all name-related properties of the contact are deleted&lt;br /&gt;
** Otherwise, the properties are imported based on the above mapping, with the multi-values in &amp;lt;tt&amp;gt;prefixes&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;suffixes&amp;lt;/tt&amp;gt; being concatenated into the corresponding OX contact properties &amp;lt;tt&amp;gt;title&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;suffix&amp;lt;/tt&amp;gt; &lt;br /&gt;
* During export, the OX contact name properties are serialized to a previously saved original vCard as follows:&lt;br /&gt;
** If no single OX property that forms the structured name is set anymore, the corresponding vCard property is deleted during the update&lt;br /&gt;
** Otherwise, the names serialized into a new or already existing &amp;lt;tt&amp;gt;N&amp;lt;/tt&amp;gt; property following the above mapping rules, with the multi-value properties &amp;lt;tt&amp;gt;prefixes&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;suffixes&amp;lt;/tt&amp;gt; being filled with the &amp;lt;tt&amp;gt;title&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;suffix&amp;lt;/tt&amp;gt; values, split by whitespace&lt;br /&gt;
&lt;br /&gt;
==== Organization ====&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc6350#section-6.6.4&lt;br /&gt;
* OX contacts store the organization-related properties at the fields &amp;lt;tt&amp;gt;company&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;branches&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;department&amp;lt;/tt&amp;gt;&lt;br /&gt;
* In vCards, the structured text property &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; holds organizational name and units associated with the vCard, i.e. the organization name, followed by zero or more levels of organizational unit names&lt;br /&gt;
* The OX properties are mapped to the ORG structured value in the order &amp;lt;tt&amp;gt;company&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;department&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;branches&amp;lt;/tt&amp;gt;&lt;br /&gt;
* During import, the mapping to the vCard &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property is based on the following rules:&lt;br /&gt;
** If there's no &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property in the vCard, all organization-related properties of the contact are deleted&lt;br /&gt;
** Otherwise, the values of the structured property are imported, where the first value is mapped to the &amp;lt;tt&amp;gt;company&amp;lt;/tt&amp;gt;, the second one to the &amp;lt;tt&amp;gt;department&amp;lt;/tt&amp;gt;, and all further ones as &amp;lt;tt&amp;gt;branches&amp;lt;/tt&amp;gt; &lt;br /&gt;
* During export, the OX contact name properties are serialized to a previously saved original vCard as follows:&lt;br /&gt;
** If no single organization-related OX property is set anymore, the corresponding vCard property is deleted during the update&lt;br /&gt;
** Otherwise, the values are serialized into a new or already existing &amp;lt;tt&amp;gt;ORG&amp;lt;/tt&amp;gt; property, where the &amp;lt;tt&amp;gt;company&amp;lt;/tt&amp;gt; as the first value, the &amp;lt;tt&amp;gt;department&amp;lt;/tt&amp;gt; as the second one, and the &amp;lt;tt&amp;gt;branches&amp;lt;/tt&amp;gt; as further values&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;br /&gt;
[[Category: User]]&lt;br /&gt;
[[Category: Clients]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=ContactStorageLDAP&amp;diff=25683</id>
		<title>ContactStorageLDAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=ContactStorageLDAP&amp;diff=25683"/>
		<updated>2021-01-13T16:20:26Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;LDAP Contact Storage&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This article is valid until the version 7.10.4 of the Open Xchange Server. For newer versions please visit&lt;br /&gt;
https://documentation.open-xchange.com/index.html&lt;br /&gt;
&lt;br /&gt;
'''Summary:''' This article describes how an existing LDAP (Lightweight Directory Access Protocol) directory can be integrated as a contact storage backend for the Open-Xchange server.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
In enterprise installations, there's often a central directory service that hosts the user data or other addressbook related entries. The Open-Xchange Server can be configured to access such data available from LDAP directories and integrate it in terms of contact folders in the groupware. For end-users, there's no difference to other contact folders, so that they can access the contents from the LDAP directory in a transparent way, e.g. when looking up participants for an appointment or choosing recipients for an e-mail message. &lt;br /&gt;
&lt;br /&gt;
Internally, a LDAP directory is configured as a read-only subfolder in the public folders tree that is automatically kept in sync with the directory via the contact-storage-ldap bundle that registers as an additional contact storage backend in the Open-Xchange Server. Changes made in the directory are reflected automatically in the groupware folder, so in contrast to the [[OXLDAPSync_Guide|OX LDAP Sync script]], this is a contact storage plugin for the server that works along with other contact storage providers such as the default database storage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
* Open-Xchange Server v6.22.1 and above (open-xchange-core, open-xchange-contact-storage-ldap)&lt;br /&gt;
* An LDAP compatible directory server (e.g. OpenLDAP, Microsoft Active Directory)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
&lt;br /&gt;
The following steps provide a walkthrough to configure access to the LDAP directory. The example describes the configuration of a folder that is backed by an Active Directory in a Microsoft Windows Server 2008 / Microsoft Exchange 2010 environment, but the steps should be similar for any other LDAP directory. &lt;br /&gt;
 &lt;br /&gt;
===Install required Bundles===&lt;br /&gt;
&lt;br /&gt;
If not yet done, install the following additional bundle on the server: open-xchange-contact-storage-ldap.&lt;br /&gt;
&lt;br /&gt;
===Configure the LDAP Folder===&lt;br /&gt;
&lt;br /&gt;
The bundle open-xchange-contact-storage-ldap is responsible for publishing contact information from the LDAP directory in a contact folder of the server. For each folder that should be served with contents of the LDAP directory, a separate configuration is necessary in a separate configuration file. After installation, a template for a folder configuration file can be found at &amp;quot;folder.properties.example&amp;quot;. To start the configuration, copy this file to a .properties file with a name of your choice, e.g. &amp;quot;e2k10.properties&amp;quot;, open the file in a text editor, and adjust the settings as needed. Please refer to the included property comments for details. The following example shows an example configuration for the aforementioned Microsoft Windows Server 2008 / Exchange 2010 environment:&lt;br /&gt;
&lt;br /&gt;
 # Properties file for a LDAP folder. &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == Folder Properties =======================================================&lt;br /&gt;
 &lt;br /&gt;
 # The context ID where the LDAP folder resides in. Required.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.contextID=1&lt;br /&gt;
 &lt;br /&gt;
 # The ID of the folder. Either the 'foldername' or the 'folderID' property must &lt;br /&gt;
 # be defined. If set, the folder ID must refer to an existing folder in the &lt;br /&gt;
 # context, which is then used by the storage.   &lt;br /&gt;
 com.openexchange.contact.storage.ldap.folderID=&lt;br /&gt;
 &lt;br /&gt;
 # Defines the display name of the folder. Either the 'foldername' or the &lt;br /&gt;
 # 'folderID' property must be defined. If set, the folder name is bound to &lt;br /&gt;
 # a folder below the system folder &amp;quot;Public folders&amp;quot; (ID 2), and is implicitly&lt;br /&gt;
 # created if it not yet exists, impersonating as the context administrator, &lt;br /&gt;
 # allowing 'read-only' kind of permissions for all users.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.foldername=Exchange 2010&lt;br /&gt;
 &lt;br /&gt;
 # The priority of the contact storage that is being registered in the server. &lt;br /&gt;
 # Any integer &amp;gt; 0 should be okay to override the default storage when &lt;br /&gt;
 # requesting the exposed LDAP folder. Defaults to 17.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.storagePriority=17&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == LDAP Attribute mapping ==================================================&lt;br /&gt;
 &lt;br /&gt;
 # Controls the way object identifiers are mapped between OX and LDAP. Possible&lt;br /&gt;
 # values are 'static' and 'persistent'. A 'static' mapping requires numerical &lt;br /&gt;
 # unique identifiers in LDAP, i.e. all mapped ID properties defined in the &lt;br /&gt;
 # mapping file point to an integer-parsable LDAP attribute. If the LDAP server&lt;br /&gt;
 # does not provide unique numerical properties, a 'persistent' ID mapping must&lt;br /&gt;
 # be configured that stores the mappings inside a mapping table in the &lt;br /&gt;
 # database. Required.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.idMapping=persistent&lt;br /&gt;
 &lt;br /&gt;
 # The filename containing the OX &amp;lt;-&amp;gt; LDAP attribute mappings for contacts. &lt;br /&gt;
 # Required. Multiple LDAP folders may share the same mapping properties file. &lt;br /&gt;
 com.openexchange.contact.storage.ldap.mappingFile=mapping.e2k10.properties&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == Cache ===================================================================&lt;br /&gt;
 &lt;br /&gt;
 # Configures the internal cache refresh interval in milliseconds. Contact &lt;br /&gt;
 # caching requires an 'authtype' of either 'admindn' or 'anonymous', along &lt;br /&gt;
 # with an 'idMapping' of either 'persistent' or 'static' and a properly &lt;br /&gt;
 # configured cache via 'cacheConfigFile'. A refresh interval of '0' disables&lt;br /&gt;
 # the cache. Defaults to '100000'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.refreshinterval=100000&lt;br /&gt;
 &lt;br /&gt;
 # The filename containing the cache configuration. Required if caching is &lt;br /&gt;
 # enabled via 'refreshinterval'. Multiple LDAP folders may share the same &lt;br /&gt;
 # cache properties file.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.cacheConfigFile=cache.properties&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == LDAP Server =============================================================&lt;br /&gt;
 &lt;br /&gt;
 # The URI of the LDAP server, should be in the format &lt;br /&gt;
 # ldap://myserver.example.com:389. For SSL access, use the ldaps protocol and &lt;br /&gt;
 # the appropriate port, e.g. ldaps://myserver.example.com:636. Required.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.uri=ldap://e2k10.example.com:389&lt;br /&gt;
 &lt;br /&gt;
 # Configures a base LDAP path. If defined, all Distinguished Names supplied to &lt;br /&gt;
 # and received from LDAP operations will be relative to the LDAP path &lt;br /&gt;
 # supplied. If not defined, the default naming context of the RootDSE is used &lt;br /&gt;
 # as baseDN. &lt;br /&gt;
 com.openexchange.contact.storage.ldap.baseDN=DC=e2k10,DC=example,DC=com&lt;br /&gt;
 &lt;br /&gt;
 # Specifies a general search filter that is applied to each LDAP search, e.g. &lt;br /&gt;
 # to restrict the search to one or more object classes. Required.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.searchfilter=(|(objectclass=group)(objectclass=user))&lt;br /&gt;
 &lt;br /&gt;
 # For testing purposes, it's possible to skip certificate validation and trust &lt;br /&gt;
 # all server certificates. Possible values are 'true' and 'false'; defaults to&lt;br /&gt;
 # 'false'.  &lt;br /&gt;
 com.openexchange.contact.storage.ldap.trustAllCerts=false&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == Authentication ==========================================================&lt;br /&gt;
 &lt;br /&gt;
 # Configures the authentication type when accessing the LDAP server. Possible &lt;br /&gt;
 # values are 'anonymous', 'admindn' or 'user'. Setting the 'authtype' to &lt;br /&gt;
 # 'admindn' will always impersonate using the properties in 'AdminDN' and &lt;br /&gt;
 # 'AdminBindPW', while 'user' will always use the credentials from the current&lt;br /&gt;
 # session's user, where the user's distinguished name is dynamically looked up &lt;br /&gt;
 # as configured via 'userLoginSource', 'userSearchAttribute' and following. &lt;br /&gt;
 # Required. &lt;br /&gt;
 com.openexchange.contact.storage.ldap.authtype=AdminDN&lt;br /&gt;
 &lt;br /&gt;
 # Specify the admin bind DN here. Required if 'authtype' is set to 'AdminDN', &lt;br /&gt;
 # or if 'authtype' is set to 'user' and 'userAuthType' to 'AdminDN'. &lt;br /&gt;
 com.openexchange.contact.storage.ldap.AdminDN=cn=administrator,cn=users,DC=e2k10,DC=example,DC=com&lt;br /&gt;
 &lt;br /&gt;
 # Specify the admin bind password here. Required if 'authtype' is set to &lt;br /&gt;
 # 'AdminDN', or if 'authtype' is set to 'user' and 'userAuthType' to 'AdminDN'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.AdminBindPW=secret&lt;br /&gt;
 &lt;br /&gt;
 # Configures the format of the username that is used during dynamic lookups &lt;br /&gt;
 # for the corresponding user on the LDAP server. Required if 'authtype' is set &lt;br /&gt;
 # to 'user'. Possible values are 'login' (the user's individual mail login as &lt;br /&gt;
 # defined in user storage), 'mail' (the user's individual primary email &lt;br /&gt;
 # address) or 'name' (the user's individual system user name).&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userLoginSource=&lt;br /&gt;
 &lt;br /&gt;
 # Configures the LDAP attribute name that matches the username as defined by &lt;br /&gt;
 # 'userLoginSource' during dynamic lookups. Required if 'authtype' is set to &lt;br /&gt;
 # 'user'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userSearchAttribute=&lt;br /&gt;
 &lt;br /&gt;
 # Specify the authentication type when that is used during user lookup here. &lt;br /&gt;
 # Required if 'authtype' is set to 'user'. Possible values are 'anonymous' and &lt;br /&gt;
 # 'admindn', while the latter one will use the credentials defined in &lt;br /&gt;
 # 'AdminDN' and 'AdminBindPW'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userAuthType=&lt;br /&gt;
 &lt;br /&gt;
 # Configures the search scope that is used during user lookup. Possible values &lt;br /&gt;
 # are 'sub', 'base' and 'one'. If left empty, the general 'searchScope' is &lt;br /&gt;
 # used.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userSearchScope=&lt;br /&gt;
 &lt;br /&gt;
 # Configures the base LDAP path that is used during user lookup. If left empty, &lt;br /&gt;
 # the general 'baseDN' is used.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userSearchBaseDN=&lt;br /&gt;
 &lt;br /&gt;
 # Configures the search filter that is used during user lookup. If left empty, &lt;br /&gt;
 # the general 'searchfilter' is used.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userSearchFilter=&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == Advanced LDAP configuration =============================================&lt;br /&gt;
 &lt;br /&gt;
 # Configures how deep to search within the search base. Possible values are &lt;br /&gt;
 # 'sub' (entire subtree), 'base' (base object only) or 'one' (one level &lt;br /&gt;
 # subordinate to the base object). Defaults to 'sub'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.searchScope=sub&lt;br /&gt;
 &lt;br /&gt;
 # Specifies how to handle referrals. Possible values are 'follow' to follow,&lt;br /&gt;
 # 'ignore' to ignore referrals or 'standard' to use the default JNDI setting. &lt;br /&gt;
 # Defaults to 'follow'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.referrals=follow&lt;br /&gt;
 &lt;br /&gt;
 # Defines whether LDAP connection pooling is enabled or not. Possible values &lt;br /&gt;
 # are 'true' and 'false'; defaults to 'false'.  &lt;br /&gt;
 com.openexchange.contact.storage.ldap.connectionPooling=true&lt;br /&gt;
 &lt;br /&gt;
 # If connection pooling is enabled, this configures the timeout when waiting &lt;br /&gt;
 # to access a pooled connection. Optional. &lt;br /&gt;
 com.openexchange.contact.storage.ldap.pooltimeout=&lt;br /&gt;
 &lt;br /&gt;
 # Controls how to dereference aliases. Possible values are 'always' to always,&lt;br /&gt;
 # 'never' to never dereference aliases, 'finding' to dereference during name&lt;br /&gt;
 # or 'searching' to dereference after name resolution. Defaults to 'always'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.derefAliases=always&lt;br /&gt;
 &lt;br /&gt;
 # Specifies the requested size for paged results. '0' disables paged results. &lt;br /&gt;
 # Defaults to '500'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.pagesize=500&lt;br /&gt;
 &lt;br /&gt;
 # Configures where the search results should be sorted. Possible values are &lt;br /&gt;
 # 'server' (sorting by the LDAP server) or 'groupware' (sorting by the &lt;br /&gt;
 # groupware server). Defaults to 'groupware'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.sorting=server&lt;br /&gt;
 &lt;br /&gt;
 # Specifies if support for querying deleted objects is enabled or not. When &lt;br /&gt;
 # enabled, deleted objects are identified with the filter 'isDeleted=TRUE',&lt;br /&gt;
 # which is only available in Active Directory. There, information about &lt;br /&gt;
 # deleted objects are available for the following lifetimes:&lt;br /&gt;
 # 60 days for forests initially built using W2k and Server 2k3&lt;br /&gt;
 # 180 days for forests that were initially built with Server 2k3 SP1&lt;br /&gt;
 # Possible values are 'true' and 'false', defaults to 'false'. When disabled,&lt;br /&gt;
 # no results are available for this folder for the 'deleted' API call. &lt;br /&gt;
 # Therefore, any synchronization-based usage will not be available.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.ADS_deletion_support=true&lt;br /&gt;
 &lt;br /&gt;
 # Defines whether empty distribution lists, i.e. lists that do not contain any&lt;br /&gt;
 # member, are excluded or not. Possible values are 'true' and 'false'; &lt;br /&gt;
 # defaults to 'true'.  &lt;br /&gt;
 com.openexchange.contact.storage.ldap.excludeEmptyLists=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configure Mappings===&lt;br /&gt;
 &lt;br /&gt;
Besides the configuration of the folder and how to access the LDAP directory, a mapping file is used to define how LDAP entries can be converted to groupware contacts and distribution lists. After installation, templates for mapping files can be found at &amp;quot;mappings.ads.properties.example&amp;quot; and &amp;quot;mappings.openldap.properties.example&amp;quot;. To start the configuration, copy such a template file to the .properties file named as configured via com.openexchange.contact.storage.ldap.mappingFile in the previous step, e.g. &amp;quot;mapping.e2k10.properties&amp;quot;. Then, open the file in a text editor, and adjust the attribute mappings as needed. Please refer to the included comments for details. The following example shows an example configuration for the aforementioned Microsoft Windows Server 2008 / Exchange 2010 environment:&lt;br /&gt;
 &lt;br /&gt;
 # Mapping between attributes of OX contacts and LDAP objects&lt;br /&gt;
 &lt;br /&gt;
 # Contact properties are set based on the mapped LDAP attribute name. Empty &lt;br /&gt;
 # mappings are ignored. It's possible to define a second LDAP attribute name &lt;br /&gt;
 # for a property that is used as fall-back if the first one is empty in a &lt;br /&gt;
 # LDAP result, e.g. to define multiple attributes for a display name, or to &lt;br /&gt;
 # have multiple mappings for contacts and distribution lists.  &lt;br /&gt;
 &lt;br /&gt;
 # For the data-types, each LDAP attribute value is converted/parsed to the type &lt;br /&gt;
 # necessary on the server (Strings, Numbers, Booleans). Dates are assumed to&lt;br /&gt;
 # be in UTC and parsed using the pattern 'yyyyMMddHHmmss'. Binary properties&lt;br /&gt;
 # may be indicated by appending ';binary' to the LDAP attribute name. Boolean&lt;br /&gt;
 # properties may also be set based on a comparison with the LDAP attribute &lt;br /&gt;
 # value, which is defined by the syntax '[LDAP_ATTRIBUTE_NAME]=&lt;br /&gt;
 # [EXPECTED_VALUE]', e.g. to set the 'mark_as_distribution_list' property &lt;br /&gt;
 # based on a specific 'objectClass' value.  &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == ID Mappings =============================================================&lt;br /&gt;
 &lt;br /&gt;
 # Numerical IDs are used by the groupware server to identify an object or &lt;br /&gt;
 # user, and therefore should be mapped to an adequate LDAP unique property of&lt;br /&gt;
 # the LDAP server. If no numerical identifiers are provided by the LDAP server, &lt;br /&gt;
 # a mapping between the LDAP attribute values and groupware IDs is applied in &lt;br /&gt;
 # an additional step (as configured by the 'idMapping' in the folder's &lt;br /&gt;
 # properties). Binary LDAP attributes are tried to be interpreted as 16-byte &lt;br /&gt;
 # GUIDs. &lt;br /&gt;
 &lt;br /&gt;
 # The object ID is always required and must be unique for the LDAP server &lt;br /&gt;
 com.openexchange.contact.storage.ldap.objectid    = objectGUID;binary&lt;br /&gt;
 &lt;br /&gt;
 # The internal user ID is required if the folder is configured to replace the&lt;br /&gt;
 # global address book. Note that if used, the value of the attribute must &lt;br /&gt;
 # match the internal user ID in the groupware server. &lt;br /&gt;
 com.openexchange.contact.storage.ldap.internal_userid  = &lt;br /&gt;
 &lt;br /&gt;
 # If not set, the 'created_by' contact property is set to the context admin. &lt;br /&gt;
 # When using the folder as replacement for the global address book, and the&lt;br /&gt;
 # users should be able to edit their own entries, this property should be&lt;br /&gt;
 # mapped to the same LDAP attribute as 'internal_userid'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.created_by   = &lt;br /&gt;
 &lt;br /&gt;
 # If not set, the 'modified_by' contact property is set to the context admin.&lt;br /&gt;
 # When using the folder as replacement for the global address book, and the&lt;br /&gt;
 # users should be able to edit their own entries, this property should be&lt;br /&gt;
 # mapped to the same LDAP attribute as 'internal_userid'.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.modified_by   = &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == String mappings =========================================================&lt;br /&gt;
 &lt;br /&gt;
 com.openexchange.contact.storage.ldap.displayname   = displayName,name&lt;br /&gt;
 com.openexchange.contact.storage.ldap.file_as   = displayName,name&lt;br /&gt;
 com.openexchange.contact.storage.ldap.givenname    = givenName&lt;br /&gt;
 com.openexchange.contact.storage.ldap.surname    = sn&lt;br /&gt;
 com.openexchange.contact.storage.ldap.email1    = mail&lt;br /&gt;
 com.openexchange.contact.storage.ldap.department   = department&lt;br /&gt;
 com.openexchange.contact.storage.ldap.company    = company&lt;br /&gt;
 com.openexchange.contact.storage.ldap.branches    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.business_category  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.postal_code_business = postalCode&lt;br /&gt;
 com.openexchange.contact.storage.ldap.state_business  = st&lt;br /&gt;
 com.openexchange.contact.storage.ldap.street_business  = streetAddress&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_callback =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.city_home    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.commercial_register =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.country_home   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.email2    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.email3    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.employeetype   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.fax_business   = facsimileTelehoneNumber&lt;br /&gt;
 com.openexchange.contact.storage.ldap.fax_home    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.fax_other    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.instant_messenger1 =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.instant_messenger2 =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_ip   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_isdn  = internationaliSDNNumber&lt;br /&gt;
 com.openexchange.contact.storage.ldap.manager_name   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.marital_status  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.cellular_telephone1 = mobile&lt;br /&gt;
 com.openexchange.contact.storage.ldap.cellular_telephone2 =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.nickname    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.number_of_children =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.number_of_employee =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.note     = info&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_pager  = pager&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_assistant =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_business1 = telephoneNumber&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_business2 =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_car   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_company  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_home1  = homePhone&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_home2  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_other  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.postal_code_home  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.profession   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_radio  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.room_number   = physicalDeliveryOfficeName&lt;br /&gt;
 com.openexchange.contact.storage.ldap.sales_volume   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.city_other   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.country_other   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.middle_name   = middleName&lt;br /&gt;
 com.openexchange.contact.storage.ldap.postal_code_other  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.state_other   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.street_other   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.spouse_name   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.state_home   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.street_home   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.suffix    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.tax_id    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_telex  = telexNumber&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_ttytdd  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.url     = wWWHomePage&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield01   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield02   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield03   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield04   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield05   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield06   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield07   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield08   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield09   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield10   = &lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield11   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield12   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield13   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield14   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield15   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield16   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield17   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield18   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield19   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.userfield20   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.city_business   = l&lt;br /&gt;
 com.openexchange.contact.storage.ldap.country_business  = co&lt;br /&gt;
 com.openexchange.contact.storage.ldap.assistant_name  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.telephone_primary  =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.categories   =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.title     = title&lt;br /&gt;
 com.openexchange.contact.storage.ldap.position    = &lt;br /&gt;
 com.openexchange.contact.storage.ldap.uid     = objectGUID;binary&lt;br /&gt;
 com.openexchange.contact.storage.ldap.profession   = title&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == Date mappings ===========================================================&lt;br /&gt;
 &lt;br /&gt;
 com.openexchange.contact.storage.ldap.birthday    =&lt;br /&gt;
 com.openexchange.contact.storage.ldap.anniversary   =&lt;br /&gt;
 &lt;br /&gt;
 # The last-modified and creation dates are required by the groupware server, &lt;br /&gt;
 # therefore an implicit default date is assumed when no LDAP property is &lt;br /&gt;
 # mapped here, and no results are available for this folder for the 'modified'&lt;br /&gt;
 # and 'deleted' API calls. Therefore, any synchronization-based usage will not&lt;br /&gt;
 # be available.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.lastmodified   = whenChanged&lt;br /&gt;
 com.openexchange.contact.storage.ldap.creationdate   = whenCreated&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # == Misc mappings ===========================================================&lt;br /&gt;
 &lt;br /&gt;
 # Distribution list members are resolved dynamically using the DNs found in &lt;br /&gt;
 # the  mapped LDAP property&lt;br /&gt;
 com.openexchange.contact.storage.ldap.distributionlist  = member&lt;br /&gt;
 &lt;br /&gt;
 # Special mapping where the boolean value is evaluated using a string &lt;br /&gt;
 # comparison with the attribute value&lt;br /&gt;
 com.openexchange.contact.storage.ldap.markasdistributionlist= objectClass=group&lt;br /&gt;
 &lt;br /&gt;
 # Integer value between 1 and 3 specifying one of the values in email1... email3&lt;br /&gt;
 com.openexchange.contact.storage.ldap.defaultaddress  = &lt;br /&gt;
 &lt;br /&gt;
 # Contact image, binary format is expected.&lt;br /&gt;
 com.openexchange.contact.storage.ldap.image1    = jpegPhoto&lt;br /&gt;
 # Should map to the actual image property&lt;br /&gt;
 com.openexchange.contact.storage.ldap.number_of_images  = jpegPhoto&lt;br /&gt;
 # Should map to the actual image property&lt;br /&gt;
 com.openexchange.contact.storage.ldap.image_last_modified = jpegPhoto&lt;br /&gt;
 # Should map to the actual image property&lt;br /&gt;
 com.openexchange.contact.storage.ldap.image1_content_type = jpegPhoto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Upgrading from Contacts LDAP==&lt;br /&gt;
&lt;br /&gt;
Due to different configuration parameters and a different config file handling, there's no automatic migration when upgrading from previous installations that used the previous LDAP integration bundle [[Contacts_LDAP_AD|&amp;quot;open-xchange-contacts-ldap&amp;quot;]], so that the configuration steps above need to be performed, too. However, most of the configuration values and mapping attributes can be copied over. Please mind the following main differences between both bundles: &lt;br /&gt;
&lt;br /&gt;
===Configuration files===&lt;br /&gt;
All configuration files are expected to be in the &amp;quot;contact-storage-ldap&amp;quot; subfolder, i.e. there's no need to create seperate subfolders for the configuration files indicating the desired contexts. Furthermore, the property names don't need to be changed according to the context ID, since there's now a separate property for that purpose:&lt;br /&gt;
 com.openexchange.contact.storage.ldap.contextID=1&lt;br /&gt;
&lt;br /&gt;
===Distribution list handling===&lt;br /&gt;
There are no longer separate mappings for display name and object ID of distributuon lists. Instead, if the LDAP attribute name differs from the one used for contacts, both LDAP attributes can be declared in the mapping, e.g.: &lt;br /&gt;
 com.openexchange.contact.storage.ldap.displayname=displayName,name&lt;br /&gt;
&lt;br /&gt;
===ID Mappings===&lt;br /&gt;
Along with the previously used 'static' ID mappings, there's a new option that allows a persistent mapping between LDAP identifiers and groupware object IDs, even if the LDAP server uses non-numerical unique identifiers. In contrast to the previously available 'dynamic' ID mapping, this non-volatile mapping allows referencing LDAP objects from external clients across sessions. Persistent mapping can be enabled via:&lt;br /&gt;
 com.openexchange.contact.storage.ldap.idMapping=persistent&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
===Incremental Synchronization===&lt;br /&gt;
&lt;br /&gt;
Different external Clients accessing the server via CardDAV have the requirement that the server is able to report all changes in a contact folder since the last synchronization. This includes updates to existing contacts, as well as deleted and newly created contacts. In order to use folders backed by the LDAP contact storage with such clients, the LDAP directory needs to be able to deliver these information, especially the so-called &amp;quot;tombstones&amp;quot; for deleted contacts, i.e. the knowledge about deleted directory entries, which is currently only available in Active Directoy and must be explicitly turned on in (see the documentation of the property for details):&lt;br /&gt;
 com.openexchange.contact.storage.ldap.ADS_deletion_support=true&lt;br /&gt;
Furthermore, a valid attribute mapping for &amp;quot;last modified&amp;quot; must be provided.&lt;br /&gt;
&lt;br /&gt;
===Caching===&lt;br /&gt;
&lt;br /&gt;
To speed-up access to the LDAP directory, some contact properties are held in a distributed JCS cache. Therefore, the new configuration file cache.properties is used (the default values should normally not be changed). Cache entries are dynamically updated after a speicifed interval. If possible, i.e. there's a mpping for the last modification time of the contacts, only changed entries are refreshed, otherwise, all contacts are reloaded from the LDAP directory.&lt;br /&gt;
&lt;br /&gt;
===Read-only===&lt;br /&gt;
&lt;br /&gt;
The LDAP contact storage works in read-only mode, meaning that any calls to create new, delete, or modify existing contacts in the folder are rejected.&lt;br /&gt;
&lt;br /&gt;
===Folders===&lt;br /&gt;
&lt;br /&gt;
It's possible to define either the ID of an existing folder that should be used by the LDAP storage, or the name of a public folder that is created dynamically if it not yet exists. If the folder is created by the LDAP storage itself, a default set of permissions is applied (owned by the context administrator, granting read-only permissions to all users). So, for the context administrator, it's still possible to apply detailed access rights to the folder by adjusting the permissions of the folder afterwards. It's also possible to to create the folder on your own and use it's folder ID in the configuration file, e.g. if the folder should not be a public folder.&lt;br /&gt;
&lt;br /&gt;
[[Category: Administrator]]&lt;br /&gt;
[[Category: AppSuite]]&lt;br /&gt;
[[Category: OX6]]&lt;br /&gt;
[[Category: LDAP]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:7_10_Database_Migration&amp;diff=25587</id>
		<title>AppSuite:7 10 Database Migration</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:7_10_Database_Migration&amp;diff=25587"/>
		<updated>2020-09-03T11:47:21Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.10.0}}&lt;br /&gt;
&lt;br /&gt;
= Database Migration with OX App Suite v7.10.0 =&lt;br /&gt;
&lt;br /&gt;
OX App Suite v7.10.0 introduces significant changes regarding the underlying MySQL database system that require special attention in case of upgrades from former versions. Please read this paper carefully to ensure a smooth and clean upgrade process.&lt;br /&gt;
&lt;br /&gt;
== Change Overview ==&lt;br /&gt;
&lt;br /&gt;
The most significant changes are:&lt;br /&gt;
* New version and configuration requirements.&lt;br /&gt;
* Most VARCHAR columns need to be migrated to utf8mb4 character encoding.&lt;br /&gt;
* A major rewrite of the calendar application requires full data migration.&lt;br /&gt;
&lt;br /&gt;
We strongly recommend to thoroughly plan and test the upgrade procedure. To gain insights about update task runtimes and the expected load, our recommendation is to clone ConfigDB and the biggest UserDB and perform an isolated test upgrade that especially covers the calendar migration and character encoding changes. Update task durations can be significantly longer than with previous upgrades and the migrations might cause noticeable higher I/O load. Also some additional disk space is needed during and after the migrations.&lt;br /&gt;
&lt;br /&gt;
== Database System ==&lt;br /&gt;
&lt;br /&gt;
MySQL Server is supported in versions 5.6 and 5.7 with recent patch levels only and MariaDB Server 10.1 and 10.2 respectively. Support for 5.6/10.1 exists for compatibility reasons and is transitional. We recommend upgrading to 5.7/10.2 as soon as possible. Any database system upgrade must happen before App Suite is upgraded to OX App Suite v7.10.0. Please follow the respective guides of your database vendor carefully.&lt;br /&gt;
&lt;br /&gt;
Different App Suite and database system versions require different configurations of the DBMS, please follow [[My.cnf]] to have your database configured in a sane way. Especially the following items require some attention with the upgrade to App Suite 7.10.0 and upgrades of the DBMS itself:&lt;br /&gt;
&lt;br /&gt;
* Supported SQL modes are only &amp;lt;code&amp;gt;NO_ENGINE_SUBSTITUTION&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;NO_AUTO_CREATE_USER&amp;lt;/code&amp;gt;. Starting with App Suite 7.10.0, &amp;lt;code&amp;gt;ONLY_FULL_GROUP_BY&amp;lt;/code&amp;gt; is also supported for MySQL 5.7. It is still not with older versions of MySQL or any MariaDB version! To review the current value, use &amp;lt;code&amp;gt;SHOW GLOBAL VARIABLES WHERE Variable_name = 'sql_mode';&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure that &amp;lt;code&amp;gt;character_set_server&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; for App Suite 7.8.x. Again the current global default value can be obtained via &amp;lt;code&amp;gt;SHOW GLOBAL VARIABLES WHERE Variable_name = 'character_set_server';&amp;lt;/code&amp;gt;. With 7.10.0 being fully rolled out, this setting must then be changed to &amp;lt;code&amp;gt;utf8mb4&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;collation_server&amp;lt;/code&amp;gt; is configured explicitly, it must be set to a matching value according to the character set in either case!&lt;br /&gt;
&lt;br /&gt;
Note that App Suite &amp;lt;= 7.8.4 did not support MySQL 5.7/MariaDB 10.2 so far. While we recommend it for 7.10.0, this leaves a lack of definition during the upgrade process. We consider running 7.8.4 on top of MySQL 5.7/MariaDB 10.2 a valid scenario as long as it is transitional during the upgrade phase. Please take our configuration recommendations seriously to mitigate potential user-facing issues as far as possible.&lt;br /&gt;
&lt;br /&gt;
== Upgrade Procedure ==&lt;br /&gt;
&lt;br /&gt;
The upgrade to OX App Suite v7.10.0 can be performed like any other major upgrade before. However, the duration of blocking database update tasks for the mentioned charset and calendar migrations could conflict with customers’ availability demands. Therefore it is possible to decouple these special time- and resource-intensive tasks from the plain version upgrade. In this section a multi-step approach is described that performs the version upgrade before and independently from the migrations. Every step always results in a working system that is ready to serve user traffic. Some functional implications that affect user experience are outlined in the according subsections.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' Even though the first step leads to a basically working OX App Suite v7.10.0 environment, the subsequent steps are not optional but mandatory! Skipping the migrations will leave a few calendar features dysfunctional and can lead to issues with certain SQL queries that use explicit collations for searching and sorting. Running OX App Suite v7.10.0 in production without having all parts of the migration fulfilled is not supported – OX support will request you to complete the migration tasks when reporting issues that are not related to the migration itself. &lt;br /&gt;
&lt;br /&gt;
== Initial OX App Suite v7.10.0 Rollout ==&lt;br /&gt;
If not done so far, upgrade your MySQL installation to a version supported with OX App Suite v7.10.0 but configure it to be compatible with OX App Suite v7.8.x as described in the “Database System” section.&lt;br /&gt;
&lt;br /&gt;
Despite the fact that the two special migrations for calendar and character sets are explicitly skipped, this section assumes that the “Rolling Upgrade with breaking Hazelcast upgrade” is applied as described in [[AppSuite:Running_a_cluster#Updating_a_Cluster]]. For the application server upgrade, the common guide from [[AppSuite:UpdatingOXPackages]] can be followed.&lt;br /&gt;
&lt;br /&gt;
Prepare a dedicated App Suite middleware node that will be used to perform the database update tasks. The node must not be serving any user traffic and be prepared with&lt;br /&gt;
&lt;br /&gt;
* OX App Suite v7.10.0 packages&lt;br /&gt;
* Configuration according to the user production nodes&lt;br /&gt;
* The Hazelcast rolling upgrade compatibility package (see [[AppSuite:Running_a_cluster#Rolling_Upgrade_with_breaking_Hazelcast_upgrade]])&lt;br /&gt;
* Exclude the update tasks for both mentioned migrations (i.e. calendar and character encoding). See “Update Task Exclusion” for details.&lt;br /&gt;
* Execute update tasks according to your preferred strategy. More on this can be found at [[UpdateTasks]].&lt;br /&gt;
&lt;br /&gt;
By default (if using the &amp;quot;runallupdate&amp;quot; tool&amp;quot;) update tasks operate on database schemas sequentially, one at a time. All users from all contexts of a given schema are logged out and locked out. Then, DB schema changes are executed. Finally, users are unlocked and able to login again. Schemas typically contain a few thousand users (if our recommended sizing is being followed) and thus executing update tasks means bunches of a few thousand users will be affected sequentially. You will not have a full downtime. For each update task execution process the following statements hold true:&lt;br /&gt;
&lt;br /&gt;
* All users got service for nearly all the time (all the time but the time where their schema is upgraded)&lt;br /&gt;
* For each point in time, nearly all users got service (all but the ones from the currently updated schema)&lt;br /&gt;
* When update tasks are completed, all users will have been affected by one &amp;quot;logout&amp;quot; - &amp;quot;locked out&amp;quot; cycle&lt;br /&gt;
&lt;br /&gt;
After complete and successful update task execution, roll out OX App Suite v7.10.0 to one node after another. After complete rollout, reconfigure MySQL if appropriate as described in the “Database System” section.&lt;br /&gt;
&lt;br /&gt;
=== Update Task Exclusion ===&lt;br /&gt;
&lt;br /&gt;
Add the following lines to &amp;lt;code&amp;gt;/opt/open-xchange/etc/excludedupdatetasks.properties&amp;lt;/code&amp;gt; or remove the leading # character if already included, so that it contains these two lines:&lt;br /&gt;
&lt;br /&gt;
 # Character Encoding Migration&lt;br /&gt;
 com.openexchange.groupware.update.excludedUpdateTasks=groupware.utf8mb4&lt;br /&gt;
 &lt;br /&gt;
 # Calendar Migration&lt;br /&gt;
 com.openexchange.chronos.storage.rdb.migration.ChronosStorageMigrationTask&lt;br /&gt;
&lt;br /&gt;
 #Update tasks depending on the 2 above&lt;br /&gt;
 com.openexchange.chronos.storage.rdb.groupware.CalendarEventCorrectFilenamesTask&lt;br /&gt;
 com.openexchange.chronos.storage.rdb.groupware.CalendarEventCorrectRangesTask&lt;br /&gt;
 com.openexchange.chronos.storage.rdb.groupware.CalendarEventCorrectOrganizerSentByTask&lt;br /&gt;
 com.openexchange.chronos.storage.rdb.migration.ChronosStoragePurgeLegacyDataTask&lt;br /&gt;
 com.openexchange.pns.subscription.storage.groupware.PnsSubscriptionsUseUtf8mb4ForClientColumnTask&lt;br /&gt;
 com.openexchange.groupware.update.tasks.AddChecksumColumnToAttachmentsTablesUpdateTask&lt;br /&gt;
&lt;br /&gt;
The first line does not denote one dedicated update task, but a whole list of tasks. To make exclusion more convenient, the concept of update task namespaces has been introduced. All update tasks belonging to the character encoding migration are part of the &amp;lt;code&amp;gt;groupware.utf8mb4&amp;lt;/code&amp;gt; namespace. The denoted property takes care of excluding them all at once. You can list all according tasks with the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listUpdateTaskNamespaces&amp;lt;/code&amp;gt; tool.&lt;br /&gt;
&lt;br /&gt;
== Character Encoding Migration ==&lt;br /&gt;
&lt;br /&gt;
The default character encoding for Unicode (named character set by MySQL) of MySQL will become &amp;lt;code&amp;gt;utf8mb4&amp;lt;/code&amp;gt; in the near future. MariaDB on Debian Stretch (9) already has an according default configuration set when installing it from distribution packages. So far all VARCHAR columns are supposed to store at max. 3-byte UTF-8 characters due to the nature of MySQL’s utf8 character encoding. This leads to the fact that for example emojis cannot be saved as part of any App Suite entities. In a mixed-mode scenario (App Suite considers MySQL to operate in utf8mb4 mode due to the &amp;lt;code&amp;gt;character_set_server&amp;lt;/code&amp;gt; setting, while columns are specified with utf8 encoding), this leads to issues whenever certain collations during SELECT statements are enforced. To avoid such issues generally and also increase user experience by finally allowing characters from the Unicode astral plane, Open-Xchange has decided to migrate existing data structures to the utf8mb4 character encoding.&lt;br /&gt;
&lt;br /&gt;
This migration can be executed before or after the calendar migration, while it is recommend to execute it before.&lt;br /&gt;
&lt;br /&gt;
The upgrade procedure is basically the same as above in terms executing update tasks, while the server software is already up to date and needs no further upgrades:&lt;br /&gt;
&lt;br /&gt;
* Again prepare one dedicated node that doesn’t serve any user traffic&lt;br /&gt;
* Remove the according namespace property from &amp;lt;code&amp;gt;excludedupdatetasks.properties&amp;lt;/code&amp;gt; again, but still keep the “ChronosStorageMigrationTask”. Afterwards restart the open-xchange daemon.&lt;br /&gt;
* Execute update tasks according to your preferred strategy.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' The update tasks require a lot of tables to be copied and re-created, leading to high I/O and especially sequential read and write operations. For every copied table the needed MySQL disk space doubles during the update task, so ensure enough free space before running the migration.&lt;br /&gt;
&lt;br /&gt;
== Calendar Data Migration ==&lt;br /&gt;
&lt;br /&gt;
The new calendar stack in OX App Suite v7.10.0 comes along with a new data model using its very own tables in MySQL. To preserve users calendar data, an update task &amp;lt;code&amp;gt;com.openexchange.chronos.storage.rdb.migration.ChronosStorageMigrationTask&amp;lt;/code&amp;gt; has been introduced, that reads all data from the old tables, applies transformations to match the new stack and writes it into the new tables. The approach and upgrade process is described in detail at https://documentation.open-xchange.com/7.10.0/middleware/components/calendar/data_migration.html. Please read that article carefully before continuing. Especially we want to emphasize again the recommendation to test the migration with a copy of your real data to exclude or determine any issues beforehand.&lt;br /&gt;
&lt;br /&gt;
Before executing this update task, OX App Suite v7.10.0 uses the new calendar stack on top of the old database tables through a compatibility layer. As the old storage layout lacks certain functionality, not all features are functional in between the application upgrade and execution of the update task. Due to this fact, a few spots are affected where not all appointment data that the user interface allows to enter can be persisted. This includes:&lt;br /&gt;
&lt;br /&gt;
* Reminders, where still only one notification prior the appointment start is possible&lt;br /&gt;
* Colors, that cannot be mapped to the previously used labels&lt;br /&gt;
* 4-byte UTF-8 characters (emojis) are not yet possible&lt;br /&gt;
* Secret appointments, that are still stored as private ones&lt;br /&gt;
* An appointment's end timezone can't be applied, if it's different from the start timezone&lt;br /&gt;
&lt;br /&gt;
Operators of ''non-Galera'' MySQL setups - i.e. Master-Slave replication - can potentially speed up the migration by configuring &amp;lt;code&amp;gt;com.openexchange.calendar.migration.intermediateCommits = false&amp;lt;/code&amp;gt;. Per default the migration is performed in batches that separately committed, as Galera does not cope well with large transactions. By changing the setting to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, a single transaction with batch-mode enabled is used.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' The migrating of calendar data actually leads to a duplication of that data. Also with OX App Suite v7.10.0 every new calendar data is written to both, the old and the new tables redundantly to preserve to ability to roll back to OX App Suite v7.8.4. However, only the parts can preserved that match the old data model. I.e. additional features like multiple reminders or subscriptions of external calendars (Google Calendar, SchedJoules) cannot be preserved during a rollback.&lt;br /&gt;
&lt;br /&gt;
A repeated OX App Suite v7.10.0 upgrade after a former rollback to OX App Suite v7.8.4 requires to force re-execution of this update task!&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=25109</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=25109"/>
		<updated>2019-12-03T10:48:43Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific circumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stability for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests belonging to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
== Same Packages ==&lt;br /&gt;
&lt;br /&gt;
All middleware nodes participating in the Hazelcast cluster need to have the same ''open-xchange-*'' packages installed, so that all dynamically injected class definitions are available during (de-)erialization on all nodes. So for example, even if a node does not serve requests from the web client, it still requires the realtime packages for collaborative document editing or the packages for the distributed session storage being installed.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page. A full list of Hazelcast-related properties is available at https://documentation.open-xchange.com/components/middleware/config/7.8.4/#mode=features&amp;amp;feature=Hazelcast .&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a group name needs to be defined. Up to v7.10.2, an additional group password, configurable via ''com.openexchange.hazelcast.group.password'' was used. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the &lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes) or &amp;quot;multicast&amp;quot; (automatic &lt;br /&gt;
 # discovery of other nodes via multicast). Defaults to &amp;quot;empty&amp;quot;. Depending on &lt;br /&gt;
 # the specified value, further configuration might be needed, see &amp;quot;Networking&amp;quot;&lt;br /&gt;
 # section below. &lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as described in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferably not be used to serve client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members .&lt;br /&gt;
&lt;br /&gt;
To configure a node as &amp;quot;lite&amp;quot; member, the following configuration should be applied in the node's ''hazelcast.properties'' file:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.liteMember=true&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being designed to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partitioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own partitioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom partitioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continuously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session migration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionally a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed with the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== The Big Picture ==&lt;br /&gt;
&lt;br /&gt;
Updating an OX App Suite cluster is possible in several ways. The involved steps always include&lt;br /&gt;
&lt;br /&gt;
* Update the software by updating the packages through the distro's repository / software update tool&lt;br /&gt;
* Update the database schemas (so-called update tasks)&lt;br /&gt;
&lt;br /&gt;
There are some precautions required, though.&lt;br /&gt;
&lt;br /&gt;
=== Update Tasks Management ===&lt;br /&gt;
&lt;br /&gt;
It is a feature of the OX App Suite middleware to automatically start update tasks on a database schema when a user tries to login whose context lives on that schema. For installations beyond a certain size, if you just update the OX App Suite software without special handling of the update tasks, user logins will trigger an uncontrolled storm of update tasks on the databases, potentially leading to resource contention, unnecessary long update tasks runtimes, excessive load on the database server, maybe even service outages.&lt;br /&gt;
&lt;br /&gt;
So one key element of every update strategy is to avoid user logins on nodes which have already been updated to the new software version, while the database schemas are still on the old version. There are two fundamentally different approaches to this goal: use either a full downtime, or use a rolling update strategy.&lt;br /&gt;
&lt;br /&gt;
We describe the update strategy in more detail in the next section. Note that these are still high-level outlines of the actual procedure, which requires additional details with regards to Hazelcast, given further down below.&lt;br /&gt;
&lt;br /&gt;
==== Full downtime approach ====&lt;br /&gt;
&lt;br /&gt;
The full downtime approach is quite straightforward and involves&lt;br /&gt;
&lt;br /&gt;
* shutdown of all OX middleware nodes&lt;br /&gt;
* update the software on all OX App Suite (middleware and frontend) nodes&lt;br /&gt;
* execute the update tasks in a controlled way from one OX node&lt;br /&gt;
* restore the service&lt;br /&gt;
&lt;br /&gt;
This is the most general approach and always available, even if the rolling approach is not available due to Hazelcast constraints.&lt;br /&gt;
&lt;br /&gt;
==== Rolling strategy ====&lt;br /&gt;
&lt;br /&gt;
It is possible to execute the update tasks decoupled from the real update of the rest from the cluster, days or even weeks ahead of time, with the following approach:&lt;br /&gt;
&lt;br /&gt;
* If the load situation allows for it, take one node out of the loadbalancer (we call it the upgrade node). Otherwise, add a dedicated upgrade node to your cluster, identically configured to the other middleware nodes.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node&lt;br /&gt;
* update the software on the upgrade node&lt;br /&gt;
* execute all update tasks from the update node.&lt;br /&gt;
&lt;br /&gt;
In the last step, users from affected schemas will be logged out and denied service while the update tasks are running on their database schema. This is typically a short unavailability (some minutes) for a small part (1000...7000 depending on the installation) of the user base. This unavailability is of much lower impact than the unavailability of a full downtime, but you still might want to do this in the off-business hours.&lt;br /&gt;
&lt;br /&gt;
This way you end up with the production cluster running on the old version of OX App Suite, with the database already being upgraded to the next version. This is explicitly a valid and supported configuration. This approach offers the advantage that update tasks can be executed in advance, instead of doing them while the whole system is in a full maintenance downtime. Since update tasks can take some time, this is a considerable advantage.&lt;br /&gt;
&lt;br /&gt;
For the actual upgrade of the production cluster, the remaining steps are:&lt;br /&gt;
&lt;br /&gt;
* Upgrade and restart the OX App Suite software on one middleware node after another, one by one&lt;br /&gt;
* Upgrade the software on the OX App Suite frontend nodes (if these are separate nodes from the middleware nodes)&lt;br /&gt;
&lt;br /&gt;
Hazelcast will ensure that sessions from nodes which you restart are taken over by other nodes in the cluster, so ideally this step works without losing user sessions.&lt;br /&gt;
&lt;br /&gt;
For the rolling strategy to work as described, it is required that the old and new version of OX App Suite use compatible versions of the Hazelcast library. This is the case for most upgrades. However some upgrades must handle the situation that the new version of OX App Suite ships with a new version of Hazelcast incompatible to the version of Hazelcast shipped with the old version of OX App Suite. It will be stated in the release notes if this is the case for a given release. If so, then some additional steps are required during a rolling update to ensure session handling / invalidating during update tasks works properly. See below.&lt;br /&gt;
&lt;br /&gt;
== HOWTO / step-by-step instructions ==&lt;br /&gt;
&lt;br /&gt;
* Take backups of as much as possible (databases, OX config files, etc).&lt;br /&gt;
* Announce the maintenance to the users. The communication depends on which approach you chose: the full downtime approach will come with a full downtime for all users, while the rolling upgrade approach will result in some users will have a short loss of service while their schema upgrades.&lt;br /&gt;
&lt;br /&gt;
=== Full downtime approach ===&lt;br /&gt;
&lt;br /&gt;
* Initiate maintenance: Block HTTP sessions to the service. Put a reasonable maintenance page in place, probably some HTTP error 503 with a reasonable Retry-After header.&lt;br /&gt;
* Shutdown the service on all middleware nodes. Upgrade the software on all middleware and frontend nodes using the disto's package manager. See [[AppSuite:UpdatingOXPackages]] for details on how to do that. Don't forget the &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; step if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;).&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; service on one node&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that, in particular the [[UpdateTasks#How_to_see_all_schemas.3F|section]] about limited parallel execution.&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; services on the middleware nodes.&lt;br /&gt;
* Perform some crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
* Restore service: allow HTTP sessions, remove the maintenance page.&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade without breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Remember: as stated above, this is viable only if the release notes for the new version do not state that there are breaking Hazelcast changes. For example, with v7.8.4 there were breaking Hazelcast changes and in the Release Notes it was stated as follows.&lt;br /&gt;
&lt;br /&gt;
https://software.open-xchange.com/products/appsuite/doc/Release_Notes_for_Release_7.8.4_2017-05-23.pdf&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Important - Please Note&lt;br /&gt;
&lt;br /&gt;
There is a major Hazelcast library update to OX App Suite v7.8.4. This means that when updating from an earlier backend version, due to the upgraded library, it is not possible to form a cluster of nodes that run previous version of Hazelcast (i.e. exiting volatile data in the cluster will be lost during the update). A consistent Hazelcast cluster is needed for cluster-wide cache invalidation. To circumvent problems with database update tasks that need to perform cache invalidation, please follow the steps described here: http://oxpedia.org/wiki/index.php?title=AppSuite:Running_a_cluster#Upgrades_of_the_Hazelcast_library. Please also note that session migration is not possible between versions. This usually affects all user sessions that are stored in a distributed map, and will require the users to re-login after the update. Running incompatible versions of Hazelcast within a cluster will result in logentries showing the conflicting node and version information.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you find you are upgrading to a version with breaking Hazelcast changes, please consult the next section [[#Rolling_Upgrade_with_breaking_Hazelcast_upgrade]].&lt;br /&gt;
&lt;br /&gt;
==== Description of the upgrade process ====&lt;br /&gt;
&lt;br /&gt;
The procedure consists of a '''pre-update''' where one update node will be taken out of the HTTP traffic, to execute database update tasks from that node, and a '''real update''', where all of the cluster nodes will get updated to the new version of the software.&lt;br /&gt;
&lt;br /&gt;
The pre-update will not make the new version of the software available to the users. It will run as kind of &amp;quot;background task&amp;quot;, mostly invisible for the users (but see below for a description of the impact of the update tasks on user experience).&lt;br /&gt;
&lt;br /&gt;
==== Pre-update ====&lt;br /&gt;
&lt;br /&gt;
The following steps all refer to one special middleware node, the so-called ''upgrade node''. The other cluster nodes are not affected by this step.&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that.&lt;br /&gt;
** Note that executing update tasks on database schemas will result in users from the given database schema to be logged out and locked out during the update tasks.&lt;br /&gt;
** You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
==== Real Update ====&lt;br /&gt;
&lt;br /&gt;
The following steps refer to all cluster nodes (but the upgrade node, which had been updated before).&lt;br /&gt;
&lt;br /&gt;
* For one middleware cluster node after each nother:&lt;br /&gt;
** Update packages on that middleware node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
** Verify the node starts its bundles, joins the Hazelcast cluster, log files are clean, the node handles sessions&lt;br /&gt;
* For one frontend node after each other (if you've got separate frontend nodes):&lt;br /&gt;
** Update packages on that frontend node. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Finally, if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;), execute &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; with a &amp;lt;code&amp;gt;--timestamp&amp;lt;/code&amp;gt; argument as described on the page [[AppSuite:UpdatingOXPackages]]&lt;br /&gt;
* Perform final crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade with breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Cf [[#Upgrades_of_the_Hazelcast_library]] below.&lt;br /&gt;
&lt;br /&gt;
In principle the steps given in the previous section apply. However the upgrade needs to get the special Hazelcast Upgrade Package installed (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...) during execution of the update tasks.&lt;br /&gt;
&lt;br /&gt;
So the pre-update steps look like:&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Install the special Hazelcast Upgrade Package on the upgrade node (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...). Restart the service again.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that. You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
Note: don't worry if you don't see the upgrade node joining the legacy cluster: the upgrade node will not join the legacy cluster / not be visible there since the upgrade node will be a so-called &amp;quot;native client&amp;quot; to the legacy cluster, and it will be created on the fly (and subsequently disposed again) for propagating an event. So also on &amp;lt;code&amp;gt;netstat&amp;lt;/code&amp;gt; level the upgrade node will not have visible connections to the legacy cluster (unless for the very short timeframe when an actual even is sent). You can verify the functionality of that package by log lines like&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; Successfully initialzed Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the overly prudent it might be an idea to prepare a special test context with a test user living in its dedicated (test) schema, so you can test the functionality of this mechanism during upgrade first.&lt;br /&gt;
&lt;br /&gt;
After the DB update tasks you can remove the special upgrade package again from the upgrade node.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Real Upgrade&amp;quot; procedure then looks like [[#Rolling_Upgrade_without_breaking_Hazelcast_upgrade|above]].&lt;br /&gt;
&lt;br /&gt;
== Reference Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Limitations ===&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading a single Node ===&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
=== Upgrades of the Hazelcast library ===&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases. Starting with v7.10.3, separation of the clusters during rolling upgrades is enforced using by appending a version suffix to the cluster group name.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If a different join mechanism like ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''. &lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utility as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.3 to v7.8.4 using the package named ''open-xchange-cluster-upgrade-from-783'', since v7.8.3 utilizes Hazelcast v3.7.1&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.4 to v7.10.0 using the package named ''open-xchange-cluster-upgrade-from-784'', since v7.8.4 utilizes Hazelcast v3.8.1&lt;br /&gt;
&lt;br /&gt;
... and so on.&lt;br /&gt;
&lt;br /&gt;
'''Operations Note:''' The upgraded node will connect temporary as so-called [http://docs.hazelcast.org/docs/2.3/manual/html/ch15.html Native Client] to the legacy Hazelcast Cluster.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Native Client enables you to do all Hazelcast operations without being a member of the cluster.&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
However Native client is not member and relies on one of the cluster members.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means, the upgraded node will not be visible in the members list of the legacy Hazelcast cluster (&amp;lt;code&amp;gt;showruntimestats -c&amp;lt;/code&amp;gt;). Furthermore, the native client will created and destructed on single context events, with the effect that connections will only be visible in the very moment of such an event. This means effectively that verification of the invalidation mechanism is only possible by actually executing the &amp;lt;code&amp;gt;runupdate&amp;lt;/code&amp;gt; CLT. This should produce log lines like&lt;br /&gt;
&lt;br /&gt;
 Successfully initialized Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&lt;br /&gt;
&lt;br /&gt;
Most importantly, you should be able to observe correct functionality (users of affected contexts being logged out). It may be handy to prepare a dedicated schema with just test contexts inside. (How to create this is out of scope here, but hint: use &amp;lt;code&amp;gt;createschema&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;createcontext --schema-name&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
=== Other Considerations ===&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
* When performing a rolling upgrade of the middleware nodes in the cluster to 7.10.2 from a previous version (7.10.1 and earlier), the upgraded nodes will not join the Hazelcast cluster and fail to startup properly due to a change in the join process of the underlying Hazelcast library. Therefore, a new configuration switch is introduced that takes care to dynamically append the Hazelcast version to the cluster name so that a new cluster group is created automatically for the upgraded nodes: &amp;lt;code&amp;gt;com.openexchange.hazelcast.group.name.appendVersion&amp;lt;/code&amp;gt;. Please mind that this configuration property is only applicable for 7.10.2; later versions starting with 7.10.3 will always append the version identifier to the group name. The default value is &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, so that there are no surprises when patching an existing 7.10.2 installation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=24747</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=24747"/>
		<updated>2019-06-28T11:26:55Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific cirumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stability for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests belonging to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
== Same Packages ==&lt;br /&gt;
&lt;br /&gt;
All middleware nodes participating in the Hazelcast cluster need to have the same ''open-xchange-*'' packages installed, so that all dynamically injected class definitions are available during (de-)erialization on all nodes. So for example, even if a node does not serve requests from the web client, it still requires the realtime packages for collaborative document editing or the packages for the distributed session storage being installed.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page. A full list of Hazelcast-related properties is available at https://documentation.open-xchange.com/components/middleware/config/7.8.4/#mode=features&amp;amp;feature=Hazelcast .&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a group name needs to be defined. Up to v7.10.2, an additional group password, configurable via ''com.openexchange.hazelcast.group.password'' was used. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the &lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes) or &amp;quot;multicast&amp;quot; (automatic &lt;br /&gt;
 # discovery of other nodes via multicast). Defaults to &amp;quot;empty&amp;quot;. Depending on &lt;br /&gt;
 # the specified value, further configuration might be needed, see &amp;quot;Networking&amp;quot;&lt;br /&gt;
 # section below. &lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as decribed in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferrably not be used to serve client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members .&lt;br /&gt;
&lt;br /&gt;
To configure a node as &amp;quot;lite&amp;quot; member, the following configuration should be applied in the node's ''hazelcast.properties'' file:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.liteMember=true&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being designed to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partitioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own partitioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom partitioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continuously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session migration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionaly a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed witht the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== The Big Picture ==&lt;br /&gt;
&lt;br /&gt;
Updating an OX App Suite cluster is possible in several ways. The involved steps always include&lt;br /&gt;
&lt;br /&gt;
* Update the software by updating the packages through the distro's repository / software update tool&lt;br /&gt;
* Update the database schemas (so-called update tasks)&lt;br /&gt;
&lt;br /&gt;
There are some precautions required, though.&lt;br /&gt;
&lt;br /&gt;
=== Update Tasks Management ===&lt;br /&gt;
&lt;br /&gt;
It is a feature of the OX App Suite middleware to automatically start update tasks on a database schema when a user tries to login whose context lives on that schema. For installations beyond a certain size, if you just update the OX App Suite software without special handling of the update tasks, user logins will trigger an uncontrolled storm of update tasks on the databases, potentially leading to resource contention, unnecessary long update tasks runtimes, excessive load on the database server, maybe even service outages.&lt;br /&gt;
&lt;br /&gt;
So one key element of every update strategy is to avoid user logins on nodes which have already been updated to the new software version, while the database schemas are still on the old version. There are two fundamentally different approaches to this goal: use either a full downtime, or use a rolling update strategy.&lt;br /&gt;
&lt;br /&gt;
We describe the update strategy in more detail in the next section. Note that these are still high-level outlines of the actual procedure, which requires additional details with regards to Hazelcast, given further down below.&lt;br /&gt;
&lt;br /&gt;
==== Full downtime approach ====&lt;br /&gt;
&lt;br /&gt;
The full downtime approach is quite straightforward and involves&lt;br /&gt;
&lt;br /&gt;
* shutdown of all OX middleware nodes&lt;br /&gt;
* update the software on all OX App Suite (middleware and frontend) nodes&lt;br /&gt;
* execute the update tasks in a controlled way from one OX node&lt;br /&gt;
* restore the service&lt;br /&gt;
&lt;br /&gt;
This is the most general approach and always available, even if the rolling approach is not available due to Hazelcast constraints.&lt;br /&gt;
&lt;br /&gt;
==== Rolling strategy ====&lt;br /&gt;
&lt;br /&gt;
It is possible to execute the update tasks decoupled from the real update of the rest from the cluster, days or even weeks ahead of time, with the following approach:&lt;br /&gt;
&lt;br /&gt;
* If the load situation allows for it, take one node out of the loadbalancer (we call it the upgrade node). Otherwise, add a dedicated upgrade node to your cluster, identically configured to the other middleware nodes.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node&lt;br /&gt;
* update the software on the upgrade node&lt;br /&gt;
* execute all update tasks from the update node.&lt;br /&gt;
&lt;br /&gt;
In the last step, users from affected schemas will be logged out and denied service while the update tasks are running on their database schema. This is typically a short unavailability (some minutes) for a small part (1000...7000 depending on the installation) of the user base. This unavailability is of much lower impact than the unavailability of a full downtime, but you still might want to do this in the off-business hours.&lt;br /&gt;
&lt;br /&gt;
This way you end up with the production cluster running on the old version of OX App Suite, with the database already being upgraded to the next version. This is explicitly a valid and supported configuration. This approach offers the advantage that update tasks can be executed in advance, instead of doing them while the whole system is in a full maintenance downtime. Since update tasks can take some time, this is a considerable advantage.&lt;br /&gt;
&lt;br /&gt;
For the actual upgrade of the production cluster, the remaining steps are:&lt;br /&gt;
&lt;br /&gt;
* Upgrade and restart the OX App Suite software on one middleware node after another, one by one&lt;br /&gt;
* Upgrade the software on the OX App Suite frontend nodes (if these are separate nodes from the middleware nodes)&lt;br /&gt;
&lt;br /&gt;
Hazelcast will ensure that sessions from nodes which you restart are taken over by other nodes in the cluster, so ideally this step works without losing user sessions.&lt;br /&gt;
&lt;br /&gt;
For the rolling strategy to work as described, it is required that the old and new version of OX App Suite use compatible versions of the Hazelcast library. This is the case for most upgrades. However some upgrades must handle the situation that the new version of OX App Suite ships with a new version of Hazelcast incompatible to the version of Hazelcast shipped with the old version of OX App Suite. It will be stated in the release notes if this is the case for a given release. If so, then some additional steps are required during a rolling update to ensure session handling / invalidating during update tasks works properly. See below.&lt;br /&gt;
&lt;br /&gt;
== HOWTO / step-by-step instructions ==&lt;br /&gt;
&lt;br /&gt;
* Take backups of as much as possible (databases, OX config files, etc).&lt;br /&gt;
* Announce the maintenance to the users. The communication depends on which approach you chose: the full downtime approach will come with a full downtime for all users, while the rolling upgrade approach will result in some users will have a short loss of service while their schema upgrades.&lt;br /&gt;
&lt;br /&gt;
=== Full downtime approach ===&lt;br /&gt;
&lt;br /&gt;
* Initiate maintenance: Block HTTP sessions to the service. Put a reasonable maintenance page in place, probably some HTTP error 503 with a reasonable Retry-After header.&lt;br /&gt;
* Shutdown the service on all middleware nodes. Upgrade the software on all middleware and frontend nodes using the disto's package manager. See [[AppSuite:UpdatingOXPackages]] for details on how to do that. Don't forget the &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; step if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;).&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; service on one node&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that, in particular the [[UpdateTasks#How_to_see_all_schemas.3F|section]] about limited parallel execution.&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; services on the middleware nodes.&lt;br /&gt;
* Perform some crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
* Restore service: allow HTTP sessions, remove the maintenance page.&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade without breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Remember: as stated above, this is viable only if the release notes for the new version do not state that there are breaking Hazelcast changes. For example, with v7.8.4 there were breaking Hazelcast changes and in the Release Notes it was stated as follows.&lt;br /&gt;
&lt;br /&gt;
https://software.open-xchange.com/products/appsuite/doc/Release_Notes_for_Release_7.8.4_2017-05-23.pdf&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Important - Please Note&lt;br /&gt;
&lt;br /&gt;
There is a major Hazelcast library update to OX App Suite v7.8.4. This means that when updating from an earlier backend version, due to the upgraded library, it is not possible to form a cluster of nodes that run previous version of Hazelcast (i.e. exiting volatile data in the cluster will be lost during the update). A consistent Hazelcast cluster is needed for cluster-wide cache invalidation. To circumvent problems with database update tasks that need to perform cache invalidation, please follow the steps described here: http://oxpedia.org/wiki/index.php?title=AppSuite:Running_a_cluster#Upgrades_of_the_Hazelcast_library. Please also note that session migration is not possible between versions. This usually affects all user sessions that are stored in a distributed map, and will require the users to re-login after the update. Running incompatible versions of Hazelcast within a cluster will result in logentries showing the conflicting node and version information.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you find you are upgrading to a version with breaking Hazelcast changes, please consult the next section [[#Rolling_Upgrade_with_breaking_Hazelcast_upgrade]].&lt;br /&gt;
&lt;br /&gt;
==== Description of the upgrade process ====&lt;br /&gt;
&lt;br /&gt;
The procedure consists of a '''pre-update''' where one update node will be taken out of the HTTP traffic, to execute database update tasks from that node, and a '''real update''', where all of the cluster nodes will get updated to the new version of the software.&lt;br /&gt;
&lt;br /&gt;
The pre-update will not make the new version of the software available to the users. It will run as kind of &amp;quot;background task&amp;quot;, mostly invisible for the users (but see below for a description of the impact of the update tasks on user experience).&lt;br /&gt;
&lt;br /&gt;
==== Pre-update ====&lt;br /&gt;
&lt;br /&gt;
The following steps all refer to one special middleware node, the so-called ''upgrade node''. The other cluster nodes are not affected by this step.&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that.&lt;br /&gt;
** Note that executing update tasks on database schemas will result in users from the given database schema to be logged out and locked out during the update tasks.&lt;br /&gt;
** You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
==== Real Update ====&lt;br /&gt;
&lt;br /&gt;
The following steps refer to all cluster nodes (but the upgrade node, which had been updated before).&lt;br /&gt;
&lt;br /&gt;
* For one middleware cluster node after each nother:&lt;br /&gt;
** Update packages on that middleware node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
** Verify the node starts its bundles, joins the Hazelcast cluster, log files are clean, the node handles sessions&lt;br /&gt;
* For one frontend node after each other (if you've got separate frontend nodes):&lt;br /&gt;
** Update packages on that frontend node. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Finally, if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;), execute &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; with a &amp;lt;code&amp;gt;--timestamp&amp;lt;/code&amp;gt; argument as described on the page [[AppSuite:UpdatingOXPackages]]&lt;br /&gt;
* Perform final crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade with breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Cf [[#Upgrades_of_the_Hazelcast_library]] below.&lt;br /&gt;
&lt;br /&gt;
In principle the steps given in the previous section apply. However the upgrade needs to get the special Hazelcast Upgrade Package installed (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...) during execution of the update tasks.&lt;br /&gt;
&lt;br /&gt;
So the pre-update steps look like:&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Install the special Hazelcast Upgrade Package on the upgrade node (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...). Restart the service again.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that. You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
Note: don't worry if you don't see the upgrade node joining the legacy cluster: the upgrade node will not join the legacy cluster / not be visisble there since the upgrade node will be a so-called &amp;quot;native client&amp;quot; to the legacy cluster, and it will be created on the fly (and subsequently disposed again) for propagating an event. So also on &amp;lt;code&amp;gt;netstat&amp;lt;/code&amp;gt; level the upgrade node will not have visible connections to the legacy cluster (unless for the very short timeframe when an actual even is sent). You can verify the functionality of that package by log lines like&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; Successfully initialzed Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the overly prudent it might be an idea to prepare a special test context with a test user living in its dedicated (test) schema, so you can test the functionality of this mechanis during upgrade first.&lt;br /&gt;
&lt;br /&gt;
After the DB update tasks you can remove the special upgrade package again from the upgrade node.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Real Upgrade&amp;quot; procedure then looks like [[#Rolling_Upgrade_without_breaking_Hazelcast_upgrade|above]].&lt;br /&gt;
&lt;br /&gt;
== Reference Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Limitations ===&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading a single Node ===&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
=== Upgrades of the Hazelcast library ===&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''.&lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utitlty as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.3 to v7.8.4 using the package named ''open-xchange-cluster-upgrade-from-783'', since v7.8.3 utilizes Hazelcast v3.7.1&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.4 to v7.10.0 using the package named ''open-xchange-cluster-upgrade-from-784'', since v7.8.4 utilizes Hazelcast v3.8.1&lt;br /&gt;
&lt;br /&gt;
'''Operations Note:''' The upgraded node will be added as so-called [http://docs.hazelcast.org/docs/2.3/manual/html/ch15.html Native Client] to the legacy Hazelcast Cluster.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Native Client enables you to do all Hazelcast operations without being a member of the cluster.&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
However Native client is not member and relies on one of the cluster members.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means, the upgraded node will not be visible in the members list of the legacy Hazelcast cluster (&amp;lt;code&amp;gt;showruntimestats -c&amp;lt;/code&amp;gt;). Furthermore, the native client will created and destructed on single context events, with the effect that connections will only be visible in the very moment of such an event. This means effectively that verification of the invalidation mechanis is only possible by actually executing the &amp;lt;code&amp;gt;runupdate&amp;lt;/code&amp;gt; CLT. This should produce log lines like&lt;br /&gt;
&lt;br /&gt;
 Successfully initialzed Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&lt;br /&gt;
&lt;br /&gt;
Most importantly, you should be able to observe correct functionality (users of affected contexts being logged out). It may be handy to prepare a dedicated schema with just test contexts inside. (How to create this is out of scope here, but hint: use &amp;lt;code&amp;gt;createschema&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;createcontext --schema-name&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
=== Other Considerations ===&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=24696</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=24696"/>
		<updated>2019-05-16T13:09:58Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific cirumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stability for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests belonging to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
== Same Packages ==&lt;br /&gt;
&lt;br /&gt;
All middleware nodes participating in the Hazelcast cluster need to have the same ''open-xchange-*'' packages installed, so that all dynamically injected class definitions are available during (de-)erialization on all nodes. So for example, even if a node does not serve requests from the web client, it still requires the realtime packages for collaborative document editing or the packages for the distributed session storage being installed.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page. A full list of Hazelcast-related properties is available at https://documentation.open-xchange.com/components/middleware/config/7.8.4/#mode=features&amp;amp;feature=Hazelcast .&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a name and password needs to be defined. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
 # The password used when joining the cluster. Defaults to &amp;quot;wtV6$VQk8#+3ds!a&amp;quot;. &lt;br /&gt;
 # Please change this value, and ensure it's equal on all nodes in the cluster.&lt;br /&gt;
 com.openexchange.hazelcast.group.password=wtV6$VQk8#+3ds!a&lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the &lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes) or &amp;quot;multicast&amp;quot; (automatic &lt;br /&gt;
 # discovery of other nodes via multicast). Defaults to &amp;quot;empty&amp;quot;. Depending on &lt;br /&gt;
 # the specified value, further configuration might be needed, see &amp;quot;Networking&amp;quot;&lt;br /&gt;
 # section below. &lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as decribed in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.group.password=secret&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferrably not be used to serve client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members .&lt;br /&gt;
&lt;br /&gt;
To configure a node as &amp;quot;lite&amp;quot; member, the following configuration should be applied in the node's ''hazelcast.properties'' file:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.liteMember=true&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being designed to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partitioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own partitioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom partitioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continuously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session migration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionaly a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed witht the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== The Big Picture ==&lt;br /&gt;
&lt;br /&gt;
Updating an OX App Suite cluster is possible in several ways. The involved steps always include&lt;br /&gt;
&lt;br /&gt;
* Update the software by updating the packages through the distro's repository / software update tool&lt;br /&gt;
* Update the database schemas (so-called update tasks)&lt;br /&gt;
&lt;br /&gt;
There are some precautions required, though.&lt;br /&gt;
&lt;br /&gt;
=== Update Tasks Management ===&lt;br /&gt;
&lt;br /&gt;
It is a feature of the OX App Suite middleware to automatically start update tasks on a database schema when a user tries to login whose context lives on that schema. For installations beyond a certain size, if you just update the OX App Suite software without special handling of the update tasks, user logins will trigger an uncontrolled storm of update tasks on the databases, potentially leading to resource contention, unnecessary long update tasks runtimes, excessive load on the database server, maybe even service outages.&lt;br /&gt;
&lt;br /&gt;
So one key element of every update strategy is to avoid user logins on nodes which have already been updated to the new software version, while the database schemas are still on the old version. There are two fundamentally different approaches to this goal: use either a full downtime, or use a rolling update strategy.&lt;br /&gt;
&lt;br /&gt;
We describe the update strategy in more detail in the next section. Note that these are still high-level outlines of the actual procedure, which requires additional details with regards to Hazelcast, given further down below.&lt;br /&gt;
&lt;br /&gt;
==== Full downtime approach ====&lt;br /&gt;
&lt;br /&gt;
The full downtime approach is quite straightforward and involves&lt;br /&gt;
&lt;br /&gt;
* shutdown of all OX middleware nodes&lt;br /&gt;
* update the software on all OX App Suite (middleware and frontend) nodes&lt;br /&gt;
* execute the update tasks in a controlled way from one OX node&lt;br /&gt;
* restore the service&lt;br /&gt;
&lt;br /&gt;
This is the most general approach and always available, even if the rolling approach is not available due to Hazelcast constraints.&lt;br /&gt;
&lt;br /&gt;
==== Rolling strategy ====&lt;br /&gt;
&lt;br /&gt;
It is possible to execute the update tasks decoupled from the real update of the rest from the cluster, days or even weeks ahead of time, with the following approach:&lt;br /&gt;
&lt;br /&gt;
* If the load situation allows for it, take one node out of the loadbalancer (we call it the upgrade node). Otherwise, add a dedicated upgrade node to your cluster, identically configured to the other middleware nodes.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node&lt;br /&gt;
* update the software on the upgrade node&lt;br /&gt;
* execute all update tasks from the update node.&lt;br /&gt;
&lt;br /&gt;
In the last step, users from affected schemas will be logged out and denied service while the update tasks are running on their database schema. This is typically a short unavailability (some minutes) for a small part (1000...7000 depending on the installation) of the user base. This unavailability is of much lower impact than the unavailability of a full downtime, but you still might want to do this in the off-business hours.&lt;br /&gt;
&lt;br /&gt;
This way you end up with the production cluster running on the old version of OX App Suite, with the database already being upgraded to the next version. This is explicitly a valid and supported configuration. This approach offers the advantage that update tasks can be executed in advance, instead of doing them while the whole system is in a full maintenance downtime. Since update tasks can take some time, this is a considerable advantage.&lt;br /&gt;
&lt;br /&gt;
For the actual upgrade of the production cluster, the remaining steps are:&lt;br /&gt;
&lt;br /&gt;
* Upgrade and restart the OX App Suite software on one middleware node after another, one by one&lt;br /&gt;
* Upgrade the software on the OX App Suite frontend nodes (if these are separate nodes from the middleware nodes)&lt;br /&gt;
&lt;br /&gt;
Hazelcast will ensure that sessions from nodes which you restart are taken over by other nodes in the cluster, so ideally this step works without losing user sessions.&lt;br /&gt;
&lt;br /&gt;
For the rolling strategy to work as described, it is required that the old and new version of OX App Suite use compatible versions of the Hazelcast library. This is the case for most upgrades. However some upgrades must handle the situation that the new version of OX App Suite ships with a new version of Hazelcast incompatible to the version of Hazelcast shipped with the old version of OX App Suite. It will be stated in the release notes if this is the case for a given release. If so, then some additional steps are required during a rolling update to ensure session handling / invalidating during update tasks works properly. See below.&lt;br /&gt;
&lt;br /&gt;
== HOWTO / step-by-step instructions ==&lt;br /&gt;
&lt;br /&gt;
* Take backups of as much as possible (databases, OX config files, etc).&lt;br /&gt;
* Announce the maintenance to the users. The communication depends on which approach you chose: the full downtime approach will come with a full downtime for all users, while the rolling upgrade approach will result in some users will have a short loss of service while their schema upgrades.&lt;br /&gt;
&lt;br /&gt;
=== Full downtime approach ===&lt;br /&gt;
&lt;br /&gt;
* Initiate maintenance: Block HTTP sessions to the service. Put a reasonable maintenance page in place, probably some HTTP error 503 with a reasonable Retry-After header.&lt;br /&gt;
* Shutdown the service on all middleware nodes. Upgrade the software on all middleware and frontend nodes using the disto's package manager. See [[AppSuite:UpdatingOXPackages]] for details on how to do that. Don't forget the &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; step if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;).&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; service on one node&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that, in particular the [[UpdateTasks#How_to_see_all_schemas.3F|section]] about limited parallel execution.&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; services on the middleware nodes.&lt;br /&gt;
* Perform some crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
* Restore service: allow HTTP sessions, remove the maintenance page.&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade without breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Remember: as stated above, this is viable only if the release notes for the new version do not state that there are breaking Hazelcast changes. For example, with v7.8.4 there were breaking Hazelcast changes and in the Release Notes it was stated as follows.&lt;br /&gt;
&lt;br /&gt;
https://software.open-xchange.com/products/appsuite/doc/Release_Notes_for_Release_7.8.4_2017-05-23.pdf&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Important - Please Note&lt;br /&gt;
&lt;br /&gt;
There is a major Hazelcast library update to OX App Suite v7.8.4. This means that when updating from an earlier backend version, due to the upgraded library, it is not possible to form a cluster of nodes that run previous version of Hazelcast (i.e. exiting volatile data in the cluster will be lost during the update). A consistent Hazelcast cluster is needed for cluster-wide cache invalidation. To circumvent problems with database update tasks that need to perform cache invalidation, please follow the steps described here: http://oxpedia.org/wiki/index.php?title=AppSuite:Running_a_cluster#Upgrades_of_the_Hazelcast_library. Please also note that session migration is not possible between versions. This usually affects all user sessions that are stored in a distributed map, and will require the users to re-login after the update. Running incompatible versions of Hazelcast within a cluster will result in logentries showing the conflicting node and version information.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you find you are upgrading to a version with breaking Hazelcast changes, please consult the next section [[#Rolling_Upgrade_with_breaking_Hazelcast_upgrade]].&lt;br /&gt;
&lt;br /&gt;
==== Description of the upgrade process ====&lt;br /&gt;
&lt;br /&gt;
The procedure consists of a '''pre-update''' where one update node will be taken out of the HTTP traffic, to execute database update tasks from that node, and a '''real update''', where all of the cluster nodes will get updated to the new version of the software.&lt;br /&gt;
&lt;br /&gt;
The pre-update will not make the new version of the software available to the users. It will run as kind of &amp;quot;background task&amp;quot;, mostly invisible for the users (but see below for a description of the impact of the update tasks on user experience).&lt;br /&gt;
&lt;br /&gt;
==== Pre-update ====&lt;br /&gt;
&lt;br /&gt;
The following steps all refer to one special middleware node, the so-called ''upgrade node''. The other cluster nodes are not affected by this step.&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that.&lt;br /&gt;
** Note that executing update tasks on database schemas will result in users from the given database schema to be logged out and locked out during the update tasks.&lt;br /&gt;
** You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
==== Real Update ====&lt;br /&gt;
&lt;br /&gt;
The following steps refer to all cluster nodes (but the upgrade node, which had been updated before).&lt;br /&gt;
&lt;br /&gt;
* For one middleware cluster node after each nother:&lt;br /&gt;
** Update packages on that middleware node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
** Verify the node starts its bundles, joins the Hazelcast cluster, log files are clean, the node handles sessions&lt;br /&gt;
* For one frontend node after each other (if you've got separate frontend nodes):&lt;br /&gt;
** Update packages on that frontend node. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Finally, if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;), execute &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; with a &amp;lt;code&amp;gt;--timestamp&amp;lt;/code&amp;gt; argument as described on the page [[AppSuite:UpdatingOXPackages]]&lt;br /&gt;
* Perform final crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade with breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Cf [[#Upgrades_of_the_Hazelcast_library]] below.&lt;br /&gt;
&lt;br /&gt;
In principle the steps given in the previous section apply. However the upgrade needs to get the special Hazelcast Upgrade Package installed (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...) during execution of the update tasks.&lt;br /&gt;
&lt;br /&gt;
So the pre-update steps look like:&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Install the special Hazelcast Upgrade Package on the upgrade node (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...). Restart the service again.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that. You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
Note: don't worry if you don't see the upgrade node joining the legacy cluster: the upgrade node will not join the legacy cluster / not be visisble there since the upgrade node will be a so-called &amp;quot;native client&amp;quot; to the legacy cluster, and it will be created on the fly (and subsequently disposed again) for propagating an event. So also on &amp;lt;code&amp;gt;netstat&amp;lt;/code&amp;gt; level the upgrade node will not have visible connections to the legacy cluster (unless for the very short timeframe when an actual even is sent). You can verify the functionality of that package by log lines like&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; Successfully initialzed Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the overly prudent it might be an idea to prepare a special test context with a test user living in its dedicated (test) schema, so you can test the functionality of this mechanis during upgrade first.&lt;br /&gt;
&lt;br /&gt;
After the DB update tasks you can remove the special upgrade package again from the upgrade node.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Real Upgrade&amp;quot; procedure then looks like [[#Rolling_Upgrade_without_breaking_Hazelcast_upgrade|above]].&lt;br /&gt;
&lt;br /&gt;
== Reference Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Limitations ===&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading a single Node ===&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
=== Upgrades of the Hazelcast library ===&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''.&lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utitlty as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.3 to v7.8.4 using the package named ''open-xchange-cluster-upgrade-from-783'', since v7.8.3 utilizes Hazelcast v3.7.1&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.4 to v7.10.0 using the package named ''open-xchange-cluster-upgrade-from-784'', since v7.8.4 utilizes Hazelcast v3.8.1&lt;br /&gt;
&lt;br /&gt;
'''Operations Note:''' The upgraded node will be added as so-called [http://docs.hazelcast.org/docs/2.3/manual/html/ch15.html Native Client] to the legacy Hazelcast Cluster.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Native Client enables you to do all Hazelcast operations without being a member of the cluster.&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
However Native client is not member and relies on one of the cluster members.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means, the upgraded node will not be visible in the members list of the legacy Hazelcast cluster (&amp;lt;code&amp;gt;showruntimestats -c&amp;lt;/code&amp;gt;). Furthermore, the native client will created and destructed on single context events, with the effect that connections will only be visible in the very moment of such an event. This means effectively that verification of the invalidation mechanis is only possible by actually executing the &amp;lt;code&amp;gt;runupdate&amp;lt;/code&amp;gt; CLT. This should produce log lines like&lt;br /&gt;
&lt;br /&gt;
 Successfully initialzed Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&lt;br /&gt;
&lt;br /&gt;
Most importantly, you should be able to observe correct functionality (users of affected contexts being logged out). It may be handy to prepare a dedicated schema with just test contexts inside. (How to create this is out of scope here, but hint: use &amp;lt;code&amp;gt;createschema&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;createcontext --schema-name&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
=== Other Considerations ===&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:MySQL_Fulltext_Index&amp;diff=24635</id>
		<title>AppSuite:MySQL Fulltext Index</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:MySQL_Fulltext_Index&amp;diff=24635"/>
		<updated>2019-04-26T10:41:43Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: Replaced content with &amp;quot;{{Migration|title=MySQL Fulltext Index|link=https://documentation.open-xchange.com/7.10.2/middleware/administration/mysql_fulltext_index.html}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Migration|title=MySQL Fulltext Index|link=https://documentation.open-xchange.com/7.10.2/middleware/administration/mysql_fulltext_index.html}}&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Drop_Stored_Procedures&amp;diff=24634</id>
		<title>AppSuite:Drop Stored Procedures</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Drop_Stored_Procedures&amp;diff=24634"/>
		<updated>2019-04-26T10:40:44Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: Replaced content with &amp;quot;{{Migration|title=DB-User Privileges|link=https://documentation.open-xchange.com/7.10.2/middleware/administration/db_user_privileges.html}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Migration|title=DB-User Privileges|link=https://documentation.open-xchange.com/7.10.2/middleware/administration/db_user_privileges.html}}&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:DB_user_privileges&amp;diff=24633</id>
		<title>AppSuite:DB user privileges</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:DB_user_privileges&amp;diff=24633"/>
		<updated>2019-04-26T10:40:17Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: Replaced content with &amp;quot;{{Migration|title=DB-User Privileges|link=https://documentation.open-xchange.com/7.10.2/middleware/administration/db_user_privileges.html}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Migration|title=DB-User Privileges|link=https://documentation.open-xchange.com/7.10.2/middleware/administration/db_user_privileges.html}}&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:CrossContextDatabase&amp;diff=24622</id>
		<title>AppSuite:CrossContextDatabase</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:CrossContextDatabase&amp;diff=24622"/>
		<updated>2019-04-12T11:45:35Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Cross-context database&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
This article is valid from 7.8.0 to 7.10.1 and is not updated for newer versions anymore. For 7.10.2 and onwards you can find the corresponding documentation at https://documentation.open-xchange.com.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For storing data across context boundaries, a so called &amp;quot;global&amp;quot; database is used by the server. For example, such shared data could be information about guest users or data for registered OAuth applications. This article gives an overview about the basic concepts and how to setup a global database.&lt;br /&gt;
&lt;br /&gt;
== Register databases ==&lt;br /&gt;
&lt;br /&gt;
As a prerequisite, a global database needs to be registered in the Open-Xchange server's configuration database. At the storage layer, global databases are handled just like the ordinary &amp;lt;tt&amp;gt;context&amp;lt;/tt&amp;gt; databases storing all the existing groupware data. Therefore, the same underlying technologies can be used for replication like master/slave- or Galera-based setups, as well as registering additional database pools for sharding in very large installations. &lt;br /&gt;
&lt;br /&gt;
So, much similar to the groupware databases that store context-internal data, a new global database can be registered using the &amp;lt;tt&amp;gt;registerdatabase&amp;lt;/tt&amp;gt; commandline tool. To prevent the registered database being picked up for groupware data, set the &amp;lt;tt&amp;gt;maxunit&amp;lt;/tt&amp;gt; argument to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ /opt/open-xchange/sbin/registerdatabase -A oxadminmaster -P admin_master_password --name oxglobal --hostname localhost --dbuser openexchange --dbpasswd db_password --master true --maxunit 0&lt;br /&gt;
 database 8 registered&lt;br /&gt;
&lt;br /&gt;
Remember the returned database identifier, &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; in the above example, we'll need it at a later stage.&lt;br /&gt;
&lt;br /&gt;
Optionally, in case a database slave should be added, you can register it afterwards by specifying the database identifier as &amp;lt;tt&amp;gt;masterid&amp;lt;/tt&amp;gt; like follows:&lt;br /&gt;
&lt;br /&gt;
 $ /opt/open-xchange/sbin/registerdatabase -A oxadminmaster -P admin_master_password --name oxglobal_slave --hostname slave_host --dbuser openexchange --dbpasswd db_password --master false --maxunit 0 --masterid=8&lt;br /&gt;
 database 9 registered&lt;br /&gt;
&lt;br /&gt;
For smaller or test environments, it's also possible to re-use a previously registered groupware database for cross-context data, i.e. any database marked as &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt; by the &amp;lt;tt&amp;gt;listdatabase&amp;lt;/tt&amp;gt; utility may be used. Please note that all cross-context data is not accounted when calculating the database weight during context creation.&lt;br /&gt;
&lt;br /&gt;
== Context Groups ==&lt;br /&gt;
&lt;br /&gt;
As already mentioned, data inside the global database is shared between and available to all contexts in the installation. For setups serving multiple different &amp;quot;brands&amp;quot; or &amp;quot;domains&amp;quot;, this may not be the desired behavior, so that an additional level of data separation is needed for cross-context data. Therefore, one or more contexts can be classified into a specific &amp;quot;group&amp;quot;. The association with the group is done by assigning the property &amp;lt;tt&amp;gt;com.openexchange.context.group&amp;lt;/tt&amp;gt; to a context via config cascade. A context may only be part of one group, contexts without group association automatically fall into the &amp;quot;default&amp;quot; group. &lt;br /&gt;
&lt;br /&gt;
Please note that context group names must not be longer than 32 characters!&lt;br /&gt;
&lt;br /&gt;
As an example, a hoster is selling his hosted e-mail services under two different brands, called &amp;quot;Clever Hosting&amp;quot; and &amp;quot;Smart Hosting&amp;quot;. Each customer that registered an account at &amp;quot;Clever Hosting&amp;quot; now is put into the context group &amp;quot;clever_hosting&amp;quot; by setting the property &amp;lt;tt&amp;gt;com.openexchange.context.group&amp;lt;/tt&amp;gt; at any level of the config cascade, e.g. during provisioning when creating the context like: &lt;br /&gt;
&lt;br /&gt;
 $ /opt/open-xchange/sbin/createcontext [...] --config/com.openexchange.context.group=clever_hosting&lt;br /&gt;
&lt;br /&gt;
Or, if you already tagged your contexts with different taxonomy types (like &amp;lt;tt&amp;gt;clever&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;smart&amp;lt;/tt&amp;gt; in our example), the assignment to a context group can also be achieved at &amp;quot;ContextSet&amp;quot; level inside an &amp;lt;tt&amp;gt;.yml&amp;lt;/tt&amp;gt;-file of your &amp;lt;tt&amp;gt;contextSets&amp;lt;/tt&amp;gt; definitions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clever_group:&lt;br /&gt;
    withTags: clever&lt;br /&gt;
    com.openexchange.context.group: clever_hosting&lt;br /&gt;
    ui/product/name: &amp;quot;Clever Hosting&amp;quot;&lt;br /&gt;
    [...]&lt;br /&gt;
 &lt;br /&gt;
smart_group:&lt;br /&gt;
    withTags: smart&lt;br /&gt;
    com.openexchange.context.group: smart_hosting&lt;br /&gt;
    ui/product/name: &amp;quot;Smart Hosting&amp;quot;&lt;br /&gt;
    [...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the global database, the context group identifier serves as differentiating key for various data. For example, data of a guest user that was invited to a share in one context of a group can be used throughout all other contexts of the same group. Or, there may be a different set of registered OAuth applications available for each context group. Having contexts separated into different groups also allows to use different global databases as defined in the additional sections of the configuration file &amp;lt;tt&amp;gt;globaldb.yml&amp;lt;/tt&amp;gt;. The next chapter describes the global database configuration file in more detail.&lt;br /&gt;
&lt;br /&gt;
== Configure databases ==&lt;br /&gt;
&lt;br /&gt;
Global databases are defined in the configuration file &amp;lt;tt&amp;gt;globaldb.yml&amp;lt;/tt&amp;gt;. It mainly serves the purpose to map registered global databases to context groups. In case no advanced context grouping is necessary, e.g. because there's only a single brand in the installation, it's sufficient to supply the identifier of the previously registered master database, see [[#Register databases|Register databases]] above, inside the &amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt; section of the configuration file. For example, if the identifier of the global database master is &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt;, the section would look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    groups: [default]&lt;br /&gt;
    id: 8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This would lead to all cross-context data being stored at this database, assigning distinguished context groups as described in [[#Context Groups|Context Groups]] is not required. &lt;br /&gt;
&lt;br /&gt;
If there are multiple context groups, those can be directed to a specific global database by adding their names to the &amp;lt;tt&amp;gt;groups&amp;lt;/tt&amp;gt; property of a configuration section. For example, if the groups &amp;lt;tt&amp;gt;smart_hosting&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;clever_hosting&amp;lt;/tt&amp;gt; should use database &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt;, too, one could define:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    groups: [default,smart_hosting,clever_hosting]&lt;br /&gt;
    id: 8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Removing the default group name &amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt; from the groups list is not recommended, and should only be done if you can ensure that each context of the installation has it's group assignment defined correctly in the property &amp;lt;tt&amp;gt;com.openexchange.context.group&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Having contexts separated into different groups also allows to use different global databases as defined in the additional sections of the configuration file &amp;lt;tt&amp;gt;globaldb.yml&amp;lt;/tt&amp;gt;. Since context groups are bound to a configuration section by specifying the group name in the &amp;quot;groups&amp;quot; array, and each configuration section may target another global database, in theory there could be as much global databases as there are defined context groups. For example, to enforce data from the context groups &amp;lt;tt&amp;gt;smart_hosting&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;clever_hosting&amp;lt;/tt&amp;gt; being stored at separate databases, the following configuration sections would route them to the database identifiers &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;14&amp;lt;/tt&amp;gt; respectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clever:&lt;br /&gt;
    groups: [clever_hosting]&lt;br /&gt;
    id: 8&lt;br /&gt;
&lt;br /&gt;
smart:&lt;br /&gt;
    groups: [smart_hosting]&lt;br /&gt;
    id: 14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reload global db configuration ==&lt;br /&gt;
&lt;br /&gt;
After updating the globaldb.yml you have to reload the server configuration by using /opt/open-xchange/sbin/reloadconfiguration command line tool.&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;br /&gt;
[[Category: Administrator]]&lt;br /&gt;
[[Category: Database]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:OX_Drive&amp;diff=24537</id>
		<title>AppSuite:OX Drive</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:OX_Drive&amp;diff=24537"/>
		<updated>2019-02-11T08:55:25Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Source of http://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= OX Drive =&lt;br /&gt;
&lt;br /&gt;
In OX App Suite, Open-Xchange provides a cloud storage called OX Drive. It provides file- and folder synchronization across multiple devices in the simplest way for the end user, fully optimized for each device type. This article explains how to set up the server-side components for OX Drive, as well as details about the app setup.&lt;br /&gt;
&lt;br /&gt;
== Key features ==&lt;br /&gt;
&lt;br /&gt;
* Native Apps for Windows, Mac OS, iOS and Android&lt;br /&gt;
* Easy and attractive upsell properties (e.g. Upsell based on Quota limitations)&lt;br /&gt;
* Apps are specially designed for the devices they run on taking into account limitations such as battery life, screen limitations, bandwidth etc.&lt;br /&gt;
* Controlled synchronization of files across devices&lt;br /&gt;
* Storage management (e.g. quota control, upload limits)&lt;br /&gt;
* Connection type recognition and adaptation (e.g. Wi-Fi, cell network)&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
&lt;br /&gt;
OX Drive is a combination of two components:&lt;br /&gt;
* OX Drive in OX App Suite&lt;br /&gt;
* OX Drive Apps (optional native apps for synchronization)&lt;br /&gt;
&lt;br /&gt;
OX Drive is available as native app for the following operating systems:&lt;br /&gt;
* OX Drive for Windows&lt;br /&gt;
* OX Drive for Mac OS&lt;br /&gt;
* OX Drive for iOS&lt;br /&gt;
* OX Drive for Android&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
You will find the requirements under [[AppSuite:OX_System_Requirements#OX_Drive_for_Clients|OX Drive App and Platform Requirements]]&lt;br /&gt;
&lt;br /&gt;
= Server-side Installation and Configuration =&lt;br /&gt;
&lt;br /&gt;
This chapter describes how the backend components of OX Drive are installed and configured on the server.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* Open-Xchange Server v7.4.2 and above (''open-xchange-core'')&lt;br /&gt;
* Grizzly HTTP connector (''open-xchange-grizzly''), see [[AppSuite:Grizzly]] for details, with ''Comet'' support enabled in ''grizzly.properties''&lt;br /&gt;
* Valid Push-Certificates / API keys for cloud-based notifications, see configuration below&lt;br /&gt;
* Enabled Hazelcast for inter-OX-communication, see [[AppSuite:Running_a_cluster]] for details&lt;br /&gt;
&lt;br /&gt;
== Available packages ==&lt;br /&gt;
&lt;br /&gt;
Open-Xchange Drive is available with the following backend packages:&lt;br /&gt;
&lt;br /&gt;
* ''open-xchange-drive'' - The main server components for OX Drive&lt;br /&gt;
* ''open-xchange-drive-comet'' - Provides the Push interface via long-polling for the desktop apps&lt;br /&gt;
* ''open-xchange-drive-help-*'' - Online help in various languages for the OX Drive applications (these were called ''open-xchange-appsuite-help-drive-*'' in versions earlier than Open-Xchange Server v7.6.2)&lt;br /&gt;
* ''open-xchange-drive-restricted'' - Restricted components, including prerequisites for cloud-based push notifications&lt;br /&gt;
&lt;br /&gt;
Installation on the server varies depending on the underlying distribution, details are available in the following chapters.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive for Windows ===&lt;br /&gt;
&lt;br /&gt;
Additionally OX Drive for Windows can be provided to users by installing additional packages. However there are significant differences between 7.8.0 and earlier releases and 7.8.1 and later ones:&lt;br /&gt;
&lt;br /&gt;
==== 7.8.0 and earlier ====&lt;br /&gt;
&lt;br /&gt;
OX Drive for Windows can be provided via the [[AppSuite:Open-Xchange_Updater|Open-Xchange Updater]] by installing the package ''open-xchange-updater-drive''. Initial installation and updates are performed by the Updater then. You don't have to add the repositories below.&lt;br /&gt;
&lt;br /&gt;
==== 7.8.1 and later ====&lt;br /&gt;
&lt;br /&gt;
With OX App Suite 7.8.1 and OX Drive for Windows 2.0.0, the app is able to update itself and can be downloaded from the Web UI directly via the [[AppSuite:Client_Onboarding|App Onboarding Wizard]]. Therefore the wizard must be installed and configured for OX Drive users. Besides the client onboarding feature you need the following packages:&lt;br /&gt;
&lt;br /&gt;
* ''open-xchange-drive-client-windows'' - The main server component to provide the app&lt;br /&gt;
* ''open-xchange-drive-client-windows-generic'' - The package providing the final binary files to be installed on users machines.&lt;br /&gt;
&lt;br /&gt;
To make the app download available via the app onboarding wizard, you need to enable the according scenario. Edit ''/opt/open-xchange/etc/client-onboarding-scenarios.yml'' and get to the ''drivewindowsclientinstall'' section, where you have to set the ''enabled'' property to ''true''.&lt;br /&gt;
&lt;br /&gt;
Please note that there still exists a compatibility layer between the old Updater-based approach and the new direct install and self-update one. If you start providing OX Drive for Windows with 7.8.1 or later you MAY decide to enable that compatibility by installing ''open-xchange-updater-drive'', however we advice not to do so. If you already provided OX Drive for Windows with 7.8.0 or earlier, you MUST install this package and further provide the Updater. Otherwise the apps out there will not be able to be updated to the 2.0.0 version, which is then self-update capable.&lt;br /&gt;
&lt;br /&gt;
===== Custom branded apps =====&lt;br /&gt;
&lt;br /&gt;
OX Drive for Windows can be purchased with a custom theming. In such cases, the according binary files need to be installed on the middleware servers. Instead of the ''open-xchange-drive-client-windows-generic'' package, a package containing the branded binaries will be provided as ''open-xchange-drive-client-windows-&amp;lt;brand-name&amp;gt;'' and needs to be installed. You MUST then set the property ''com.openexchange.drive.update.branding'' in ''/opt/open-xchange/etc/drive-client-windows.properties'' to ''&amp;lt;brand-name&amp;gt;'' accordingly.&lt;br /&gt;
&lt;br /&gt;
It is also possible to provide multiple brands of the app via the same OX App Suite deployment, multiple ''open-xchange-drive-client-windows-&amp;lt;brand-name&amp;gt;'' packages can be installed in parallel. Which brand is available for a certain user is determined by the ''com.openexchange.drive.update.branding'' property, which can be overwritten via [[ConfigCascade|Config Cascade]] therefore.&lt;br /&gt;
&lt;br /&gt;
App brands can be managed via command line tools. The tool ''/opt/open-xchange/sbin/listdriveclients'' lists all installed brands. After updating a certain brand by installing a newer package version or installing an additional one, no server restart is necessary. Instead ''/opt/open-xchange/sbin/reloaddriveclients'' can be executed to refresh the internal server state.&lt;br /&gt;
&lt;br /&gt;
=== Redhat Enterprise Linux 6 or CentOS 6 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=rhelname|pc2v=RHEL6|backend}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL6|drive-help}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=rhelname|pc2v=RHEL6|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL6|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL6|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== Redhat Enterprise Linux 7 or CentOS 7 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=rhelname|pc2v=RHEL7|backend}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL7|drive-help}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=rhelname|pc2v=RHEL7|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL7|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL7|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== Debian GNU/Linux 8.0 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=debianname|pc2v=DebianJessie|backend}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianJessie|drive-help}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=debianname|pc2v=DebianJessie|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianJessie|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianJessie|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get install open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== Debian GNU/Linux 9.0 (valid from v7.10) ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=debianname|pc2v=DebianStretch|backend}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianStretch|drive-help}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=debianname|pc2v=DebianStretch|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianStretch|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianStretch|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get install open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== SUSE Linux Enterprise Server 12 ===&lt;br /&gt;
&lt;br /&gt;
Add the package repository using zypper if not already present:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=susename|pc2v=SLE_12|backend}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=susename|pc2v=SLE_12|drive-help}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=susename|pc2v=SLE_12|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=susename|pc2v=SLE_12|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=susename|pc2v=SLE_12|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&lt;br /&gt;
 $ zypper in open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== OX Server Edition / App Suite for UCS ===&lt;br /&gt;
&lt;br /&gt;
If you have purchased the OX Server Edition / App Suite for UCS, the OX Drive is part of the offering and after the installation/update available. The necessary package for push, is available with a valid license and can be installed via the Univention App Center.&lt;br /&gt;
&lt;br /&gt;
* The new license is already registered at the LDB after purchase.&lt;br /&gt;
* Log on at the Univention Management Console (UMC)&lt;br /&gt;
* Make sure, that the correct LDB account has been selected in the UMC module &amp;quot;OX License Management&amp;quot;&lt;br /&gt;
* Click on &amp;quot;App Center&amp;quot; at the UMC und switch to the tab &amp;quot;Repository Settings&amp;quot;&lt;br /&gt;
* Within the component list, select &amp;quot;Open-Xchange Drive&amp;quot; and press the &amp;quot;Install&amp;quot; button&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following gives an overview about the most important settings to enable file synchronization via OX Drive, especially when it comes to real-time Push notifications for the apps.&lt;br /&gt;
&lt;br /&gt;
All settings regarding the OX Drive backend component are located in the configuration file ''drive.properties''. The default configuration should be sufficient for a basic &amp;quot;up-and-running&amp;quot; setup (with the exception of defining the Push certificates and API keys for cloud-based app notifications, see next chapters). Please refer to the inline documentation of the configuration file for more advanced options. &lt;br /&gt;
&lt;br /&gt;
=== Push via Firebase Cloud Messaging (FCM) ===&lt;br /&gt;
&lt;br /&gt;
The OX Drive application for Android devices is able to receive Push notifications from the Open-Xchange Server via [https://firebase.google.com/docs/cloud-messaging/ Firebase Cloud Messaging (FCM)]. To issue those Push messages, the backend needs to be provided with a suitable API key for the corresponding Android app application. The API key is included in the restricted components installation package ''open-xchange-drive-restricted'' for the &amp;quot;vanilla&amp;quot; Android app. Alternatively, the key can be specified directly in the ''drive.properties'' configuration file:&lt;br /&gt;
&lt;br /&gt;
 # Specifies the API key of the server application. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.drive.events.gcm.enabled&amp;quot; is &amp;quot;true&amp;quot; and the package &lt;br /&gt;
 # containing the restricted drive components is not installed.&lt;br /&gt;
 com.openexchange.drive.events.gcm.key=&lt;br /&gt;
&lt;br /&gt;
Push via FCM can be enabled via:&lt;br /&gt;
&lt;br /&gt;
 # Enables or disables push event notifications to apps using the Google&lt;br /&gt;
 # Firebase Cloud Messaging (FCM) service. This requires a valid configuration for the &lt;br /&gt;
 # FCM API key, see options below. Defaults to &amp;quot;false&amp;quot;. &lt;br /&gt;
 com.openexchange.drive.events.gcm.enabled=true&lt;br /&gt;
&lt;br /&gt;
Please note that push via FCM needs to be enabled explicitly - also if ''open-xchange-drive-restricted'' is installed.&lt;br /&gt;
&lt;br /&gt;
=== Push via Apple Push Notification service (APNs) ===&lt;br /&gt;
&lt;br /&gt;
The OX Drive application for iOS and Mac OS devices is able to receive Push notifications from the Open-Xchange Server via [http://developer.apple.com/library/IOS/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html Apple Push Notification service (APNs)]. To issue those Push messages, the backend needs to be provided with a suitable keystore container file (PKCS #12) containing the APNs certificate and keys. Note that the Mac OS desktop app and the iOS mobile app are served separately with different certificates, so that both needs to be configured independently. The required certificates are already included in the restricted components installation package ''open-xchange-drive-restricted'' for the &amp;quot;vanilla&amp;quot; iOS and Mac OS applications. Therefore no additional configuration is needed. Alternatively, an external certificate can be specified directly in the ''drive.properties'' configuration file (the following only shows the setup for iOS). First, the path to the PKCS #12 container file needs to be specified at:&lt;br /&gt;
&lt;br /&gt;
 # Specifies the path to the local keystore file (PKCS #12) containing the APNS &lt;br /&gt;
 # certificate and keys for the iOS application, e.g. &lt;br /&gt;
 # &amp;quot;/opt/open-xchange/etc/drive-apns.p12&amp;quot;. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.drive.events.apn.enabled&amp;quot; is &amp;quot;true&amp;quot; and the package &lt;br /&gt;
 # containing the restricted drive components is not installed.&lt;br /&gt;
 com.openexchange.drive.events.apn.ios.keystore=&lt;br /&gt;
&lt;br /&gt;
This file is opened by the backend using the password as supplied via: &lt;br /&gt;
 &lt;br /&gt;
 # Specifies the password used when creating the referenced keystore containing&lt;br /&gt;
 # the certificate of the iOS application. Note that blank or null passwords &lt;br /&gt;
 # are in violation of the PKCS #12 specifications. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.drive.events.apn.enabled&amp;quot; is &amp;quot;true&amp;quot; and the package &lt;br /&gt;
 # containing the restricted drive components is not installed.&lt;br /&gt;
 com.openexchange.drive.events.apn.ios.password=&lt;br /&gt;
&lt;br /&gt;
Configuration also allows to switch between development and production environments, however, this setting should be ''true'' normally:&lt;br /&gt;
&lt;br /&gt;
 # Indicates which APNS service is used when sending push notifications to iOS&lt;br /&gt;
 # devices. A value of &amp;quot;true&amp;quot; will use the production service, a value of &lt;br /&gt;
 # &amp;quot;false&amp;quot; the sandbox service. Defaults to &amp;quot;true&amp;quot;.&lt;br /&gt;
 com.openexchange.drive.events.apn.ios.production=true&lt;br /&gt;
&lt;br /&gt;
The OX backend contacts the APNs servers from time to time to get informed about apps no longer reachable apps where the applications was uninstalled. The interval can be defined with the following setting: &lt;br /&gt;
&lt;br /&gt;
 # Configures the interval between queries to the APN feedback service for the&lt;br /&gt;
 # subscribed iOS devices. The value can be defined using units of measurement: &lt;br /&gt;
 # &amp;quot;D&amp;quot; (=days), &amp;quot;W&amp;quot; (=weeks) and &amp;quot;H&amp;quot; (=hours). Defaults to &amp;quot;1D&amp;quot; (one day). &lt;br /&gt;
 # Leaving this parameter empty disables the feedback queries on this node. &lt;br /&gt;
 # Since each received feedback is processed cluster-wide, only one node in the &lt;br /&gt;
 # cluster should be enabled here. &lt;br /&gt;
 com.openexchange.drive.events.apn.ios.feedbackQueryInterval=1D&lt;br /&gt;
&lt;br /&gt;
Please note that if you have multiple backend nodes in the cluster, it's recommended that only one node is configured to contact the feedback query service. Finally, Push notifications via APN for iOS can be enabled via:&lt;br /&gt;
&lt;br /&gt;
 # Enables or disables push event notifications to apps using the Apple Push&lt;br /&gt;
 # Notification service (APNS) for Mac OS devices. This requires a valid &lt;br /&gt;
 # configuration for the APNS certificate and keys, see either options below, &lt;br /&gt;
 # or install the restricted components packages for drive. Defaults to &lt;br /&gt;
 # &amp;quot;false&amp;quot;. &lt;br /&gt;
 com.openexchange.drive.events.apn.ios.enabled=false&lt;br /&gt;
&lt;br /&gt;
As stated above, configuration for Push notifications via APN for the Mac OS desktop application is configured similarly, the relevant options are prefixed with ''com.openexchange.drive.events.apn.macos''. Please also note that push via APNS needs to be enabled explicitly - also if ''open-xchange-drive-restricted'' is installed.&lt;br /&gt;
&lt;br /&gt;
=== Further Configuration ===&lt;br /&gt;
&lt;br /&gt;
* The backend component of OX Drive supplies the apps with various hyperlinks, e.g. deep-links to files and folders in the groupware webinterface or an URL to the online help. In order to point to the suitable web interface, please ensure that the correct UI web path is configured via ''com.openexchange.UIWebPath'' located in ''server.properties''.&lt;br /&gt;
* As already mentioned above, the backend relies on the [https://grizzly.java.net/comet.html Comet] component of the Grizzly http connector for sending push notifications to the desktop apps. Therefore, ''com.openexchange.http.grizzly.hasCometEnabled'' needs to be set to ''true'' in ''grizzly.properties''.&lt;br /&gt;
&lt;br /&gt;
= Enabling OX Drive for Users =&lt;br /&gt;
&lt;br /&gt;
OX Drive is enabled for all users that have the capability ''com.openexchange.capability.drive''. Please note that users need to have the ''infostore'' permission set to use drive. So the users that have ''drive'' enabled must be a subset of those users with ''infostore'' permission. Since 7.6.0 we enforce this via the default configuration. You can also enable this cabaility globally with the following setting in the ''drive.properties'' configuration file:&lt;br /&gt;
&lt;br /&gt;
 # Enables or disables the &amp;quot;drive&amp;quot; module capability globally. The capability&lt;br /&gt;
 # can also be set more fine-grained via config cascade. Per default it is only&lt;br /&gt;
 # enabled for users that have the &amp;quot;infostore&amp;quot; permission set. This is configured&lt;br /&gt;
 # in /opt/open-xchange/etc/contextSets/drive.yml.&lt;br /&gt;
 com.openexchange.capability.drive=false&lt;br /&gt;
&lt;br /&gt;
More details about capabilities can be found at [[AppSuite:Capabilities]]. Furthermore, this capability can be defined in a more granular way using the Config Cascade as described at [[ConfigCascade]].&lt;br /&gt;
&lt;br /&gt;
= Installation of the Apps =&lt;br /&gt;
&lt;br /&gt;
== Installation of Mac OS X Desktop App ==&lt;br /&gt;
&lt;br /&gt;
The OX Drive for Mac OS X is provided via the Apple App Store:&lt;br /&gt;
&lt;br /&gt;
* https://itunes.apple.com/app/ox-drive/id818195014?mt=12&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Finder Extension on Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
In order to be able to use the Finder to open documents or share objects on a Mac OS X workstation, you need to enable the Drive Finder Extension.&lt;br /&gt;
&lt;br /&gt;
How to enable the Drive Finder Extension on a Mac OS X workstation:&lt;br /&gt;
# Open the System Preferences. In the System Preferences window, select Extensions.&lt;br /&gt;
# In the Extensions window, select Finder. Enable Drive Finder Extension.&lt;br /&gt;
&lt;br /&gt;
== Installation of Windows Desktop App ==&lt;br /&gt;
&lt;br /&gt;
See [[AppSuite:OX_Drive#OX_Drive_for_Windows|OX Drive for Windows]].&lt;br /&gt;
&lt;br /&gt;
== Installation on Mobile Apps ==&lt;br /&gt;
&lt;br /&gt;
The OX Drive App is available via the different App Stores:&lt;br /&gt;
&lt;br /&gt;
* iOS: https://itunes.apple.com/app/ox-drive/id798570177?mt=8&lt;br /&gt;
&lt;br /&gt;
* Android: https://play.google.com/store/apps/details?id=com.openexchange.drive.vanilla&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== App Configuration and Deployment ==&lt;br /&gt;
&lt;br /&gt;
The user needs to enter the server URL and provide his username and password. Afterwards, app-specific settings may be configured. This includes the synchronization mode (All files / Favorites only) and Camera Upload settings on mobile devices, or the local root synchronization folder for the desktop applications. More information is available in the online documentation. &lt;br /&gt;
&lt;br /&gt;
After the initial synchronization is completed, all further changes are synchronized instantly across all devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= FAQ =&lt;br /&gt;
&lt;br /&gt;
You will find it under [http://knowledgebase.open-xchange.com/sales-marketing/additional-software/frequently-asked-questions/ox-drive-for-clients.html OX Drive App and Platform FAQ].&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=23725</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=23725"/>
		<updated>2017-10-20T05:31:13Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API], the basic conventions for exchanging messages described there are also valid for this case, especially the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (low level protocol)] and [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (login module)].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since API version 5) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter if suitable.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, if the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-file is smaller than a certain threshold (the contents may still be requested with an explicit download then).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Synchronize files for multiple folders ==&lt;br /&gt;
&lt;br /&gt;
Utilizing the [[HTTP_API#Module_.22multiple.22|multiple]] request, it is possible to execute multiple &amp;quot;syncfiles&amp;quot; requests in parallel. Especially during an initial synchronization and in combination with &amp;quot;inline&amp;quot; mode for .drive-meta files, this may reduce the number of necessary requests. Therefore, the parameters and file versions of each &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request are serializied into a JSON array of the &amp;lt;code&amp;gt;multiple&amp;lt;/code&amp;gt;-request body. In the same way, the response contains the resulting actions of each &amp;quot;syncfiles&amp;quot; result in an JSON array of the response.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of executing three &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; actions inside a single &amp;lt;code&amp;gt;mutliple&amp;lt;/code&amp;gt; request:&lt;br /&gt;
&lt;br /&gt;
 ==&amp;gt; PUT http://local.ox/ajax/multiple?session=0833ca06093a4bad826347a30bf7ace7&amp;amp;continue=true&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     }]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (92.2341 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;e9000b2444dfbc780f91df6586e24615&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1663,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;33&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 3,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723311033,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723311019,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 5,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723313260,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 8,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723316567,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723316551,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;4&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;edit&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1467622558800&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;c4ca4238a0b923820dcc509a6f75849b&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458723332449&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;46114c4a55ed74b836da0fd83809fb06&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 2531,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103432&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 20,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1460443249927,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1459842066104&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;7c1e3c12567f8279dff97faee04af9c2&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 4421093,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1460443249927&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;ba45c8f60456a672e003a875e469d0eb&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 845941,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785226&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 595284,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785374&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;9829c1949b6347cec22467e34b0814dd&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 438,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103434&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 22,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: []&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1465453273921&lt;br /&gt;
       }]&lt;br /&gt;
     }]&lt;br /&gt;
	 &lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (token login)] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;cascadePermissions&amp;lt;/code&amp;gt; (optional, available since API version 7) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, permission changes are also applied to all subfolders recursively.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Folder Data)]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Infoitem Data)]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFile&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get trash folder statistics ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets statistics about the trash folder contents. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=trashStats&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the recursively accumulated folder statistics as described in [[#FolderStats|Folder Statistics]] below. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FolderStats&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Folder Statistics&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| totalSize || Number || The total size of the contents in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| numFiles || Number || The total number of contained files.&lt;br /&gt;
|-&lt;br /&gt;
| numFolders || Number || The total number of contained folders.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=trashStats&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (64.2423 ms elapsed, 67 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 30904580,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 39,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 4&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Empty trash folder ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Empties the trash folder, i.e. permanently removes any contained files and folders. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=emptyTrash&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the updated folder statistics after the trash was emptied as described in [[#FolderStats|Folder Statistics]]. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=emptyTrash&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 0&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Autocomplete contacts ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Performs a &amp;quot;starts-with&amp;quot; search to find users, contacts and groups, e.g. to look up recipients when sharing a folder or item. &amp;lt;br /&amp;gt; &lt;br /&gt;
Prior triggering the request, clients should check the user input against the configured value of &amp;lt;code&amp;gt;minSearchChars&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; - The query to search for (no need to include additional wildcards).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding the found users, contacts and groups. Each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)], without the &amp;quot;bits&amp;quot; property set. For external contacts, the fields &amp;quot;entity&amp;quot; and &amp;quot;type&amp;quot; are also not set.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=autocomplete&amp;amp;query=tes&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test1@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test1&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test1&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 1&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 6&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test4@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=13&amp;amp;timestamp=1453973021020&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 4&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 13&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test@example.org&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;Test&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;Otto&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/contact/picture?folder=31&amp;amp;id=118493&amp;amp;timestamp=1465481052986&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test, Otto&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 3851,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;group&amp;quot;,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test Group&amp;quot;&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Move/Rename a Directory ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 6. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Explicitly performs a move or rename operation for a directory. This method is intended for the situation when no phsyical copy of the synchronized data is available on the client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=moveFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;newPath&amp;lt;/code&amp;gt; - The new target path to apply, relative to the root folder.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object in case of a successful move. The client should perform the move operation locally afterwards, then enter a normal synchronization cycle to acknowledge any changes.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://local.ox/ajax/drive?action=moveFolder&amp;amp;root=163114&amp;amp;apiVersion=6&amp;amp;path=%2ftest&amp;amp;checksum=57ff72d92073bac92f13791bf4e7baf4&amp;amp;newPath=%2ftest3&amp;amp;session=9eabd980fead41d4ac81d32f6c86da5b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (90.064 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Move/Rename a File ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 6. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Explicitly performs a move or rename operation for a file. This method is intended for the situation when no phsyical copy of the synchronized data is available on the client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=moveFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name to apply.&lt;br /&gt;
* &amp;lt;code&amp;gt;newPath&amp;lt;/code&amp;gt; - The new target path to apply, relative to the root folder.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object in case of a successful move. The client should perform the move operation locally afterwards, then enter a normal synchronization cycle to acknowledge any changes.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://local.ox/ajax/drive?action=moveFile&amp;amp;root=163162&amp;amp;apiVersion=6&amp;amp;path=%2f&amp;amp;name=wurst.txt&amp;amp;checksum=f04e78d909d69a8463afd9e4dd159dcc&amp;amp;newName=wurst2.txt&amp;amp;session=213306bec07644ae9b6cc6a16d2be022&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (43.6119 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Flags)]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=23621</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=23621"/>
		<updated>2017-08-22T06:03:36Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific cirumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stabilty for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests beloning to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page. A full list of Hazelcast-related properties is available at https://documentation.open-xchange.com/components/middleware/config/7.8.4/#mode=features&amp;amp;feature=Hazelcast .&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a name and password needs to be defined. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
 # The password used when joining the cluster. Defaults to &amp;quot;wtV6$VQk8#+3ds!a&amp;quot;. &lt;br /&gt;
 # Please change this value, and ensure it's equal on all nodes in the cluster.&lt;br /&gt;
 com.openexchange.hazelcast.group.password=wtV6$VQk8#+3ds!a&lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the &lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes) or &amp;quot;multicast&amp;quot; (automatic &lt;br /&gt;
 # discovery of other nodes via multicast). Defaults to &amp;quot;empty&amp;quot;. Depending on &lt;br /&gt;
 # the specified value, further configuration might be needed, see &amp;quot;Networking&amp;quot;&lt;br /&gt;
 # section below. &lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as decribed in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.group.password=secret&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferrably not be used to serve client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members .&lt;br /&gt;
&lt;br /&gt;
To configure a node as &amp;quot;lite&amp;quot; member, the following configuration should be applied in the node's ''hazelcast.properties'' file:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.liteMember=true&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being designed to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partitioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own partitioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom partitioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continuously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session migration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionaly a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed witht the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
== Upgrading a single Node ==&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
== Upgrades of the Hazelcast library ==&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''.&lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utitlty as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
== Other Considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=23269</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=23269"/>
		<updated>2017-05-05T13:05:14Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific cirumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stabilty for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests beloning to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page.&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a name and password needs to be defined. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
 # The password used when joining the cluster. Defaults to &amp;quot;wtV6$VQk8#+3ds!a&amp;quot;. &lt;br /&gt;
 # Please change this value, and ensure it's equal on all nodes in the cluster.&lt;br /&gt;
 com.openexchange.hazelcast.group.password=wtV6$VQk8#+3ds!a&lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the &lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes) or &amp;quot;multicast&amp;quot; (automatic &lt;br /&gt;
 # discovery of other nodes via multicast). Defaults to &amp;quot;empty&amp;quot;. Depending on &lt;br /&gt;
 # the specified value, further configuration might be needed, see &amp;quot;Networking&amp;quot;&lt;br /&gt;
 # section below. &lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as decribed in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.group.password=secret&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferrably not be used to serve client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning (preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being desgined to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom paritioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom paritioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own paritioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom paritioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session mirgration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionaly a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed witht the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
== Upgrading a single Node ==&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
== Upgrades of the Hazelcast library ==&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''.&lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utitlty as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
== Other Considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=23268</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=23268"/>
		<updated>2017-05-05T06:58:37Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API], the basic conventions for exchanging messages described there are also valid for this case, especially the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (low level protocol)] and [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (login module)].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since API version 5) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter if suitable.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, if the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-file is smaller than a certain threshold (the contents may still be requested with an explicit download then).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Synchronize files for multiple folders ==&lt;br /&gt;
&lt;br /&gt;
Utilizing the [[HTTP_API#Module_.22multiple.22|multiple]] request, it is possible to execute multiple &amp;quot;syncfiles&amp;quot; requests in parallel. Especially during an initial synchronization and in combination with &amp;quot;inline&amp;quot; mode for .drive-meta files, this may reduce the number of necessary requests. Therefore, the parameters and file versions of each &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request are serializied into a JSON array of the &amp;lt;code&amp;gt;multiple&amp;lt;/code&amp;gt;-request body. In the same way, the response contains the resulting actions of each &amp;quot;syncfiles&amp;quot; result in an JSON array of the response.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of executing three &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; actions inside a single &amp;lt;code&amp;gt;mutliple&amp;lt;/code&amp;gt; request:&lt;br /&gt;
&lt;br /&gt;
 ==&amp;gt; PUT http://local.ox/ajax/multiple?session=0833ca06093a4bad826347a30bf7ace7&amp;amp;continue=true&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     }]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (92.2341 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;e9000b2444dfbc780f91df6586e24615&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1663,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;33&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 3,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723311033,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723311019,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 5,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723313260,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 8,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723316567,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723316551,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;4&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;edit&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1467622558800&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;c4ca4238a0b923820dcc509a6f75849b&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458723332449&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;46114c4a55ed74b836da0fd83809fb06&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 2531,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103432&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 20,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1460443249927,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1459842066104&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;7c1e3c12567f8279dff97faee04af9c2&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 4421093,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1460443249927&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;ba45c8f60456a672e003a875e469d0eb&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 845941,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785226&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 595284,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785374&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;9829c1949b6347cec22467e34b0814dd&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 438,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103434&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 22,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: []&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1465453273921&lt;br /&gt;
       }]&lt;br /&gt;
     }]&lt;br /&gt;
	 &lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (token login)] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;cascadePermissions&amp;lt;/code&amp;gt; (optional, available since API version 7) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, permission changes are also applied to all subfolders recursively.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Folder Data)]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Infoitem Data)]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get trash folder statistics ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets statistics about the trash folder contents. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=trashStats&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the recursively accumulated folder statistics as described in [[#FolderStats|Folder Statistics]] below. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FolderStats&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Folder Statistics&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| totalSize || Number || The total size of the contents in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| numFiles || Number || The total number of contained files.&lt;br /&gt;
|-&lt;br /&gt;
| numFolders || Number || The total number of contained folders.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=trashStats&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (64.2423 ms elapsed, 67 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 30904580,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 39,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 4&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Empty trash folder ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Empties the trash folder, i.e. permanently removes any contained files and folders. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=emptyTrash&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the updated folder statistics after the trash was emptied as described in [[#FolderStats|Folder Statistics]]. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=emptyTrash&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 0&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Autocomplete contacts ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Performs a &amp;quot;starts-with&amp;quot; search to find users, contacts and groups, e.g. to look up recipients when sharing a folder or item. &amp;lt;br /&amp;gt; &lt;br /&gt;
Prior triggering the request, clients should check the user input against the configured value of &amp;lt;code&amp;gt;minSearchChars&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; - The query to search for (no need to include additional wildcards).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding the found users, contacts and groups. Each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)], without the &amp;quot;bits&amp;quot; property set. For external contacts, the fields &amp;quot;entity&amp;quot; and &amp;quot;type&amp;quot; are also not set.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=autocomplete&amp;amp;query=tes&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test1@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test1&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test1&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 1&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 6&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test4@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=13&amp;amp;timestamp=1453973021020&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 4&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 13&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test@example.org&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;Test&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;Otto&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/contact/picture?folder=31&amp;amp;id=118493&amp;amp;timestamp=1465481052986&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test, Otto&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 3851,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;group&amp;quot;,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test Group&amp;quot;&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Move/Rename a Directory ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 6. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Explicitly performs a move or rename operation for a directory. This method is intended for the situation when no phsyical copy of the synchronized data is available on the client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=moveFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;newPath&amp;lt;/code&amp;gt; - The new target path to apply, relative to the root folder.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object in case of a successful move. The client should perform the move operation locally afterwards, then enter a normal synchronization cycle to acknowledge any changes.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://local.ox/ajax/drive?action=moveFolder&amp;amp;root=163114&amp;amp;apiVersion=6&amp;amp;path=%2ftest&amp;amp;checksum=57ff72d92073bac92f13791bf4e7baf4&amp;amp;newPath=%2ftest3&amp;amp;session=9eabd980fead41d4ac81d32f6c86da5b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (90.064 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Move/Rename a File ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 6. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Explicitly performs a move or rename operation for a file. This method is intended for the situation when no phsyical copy of the synchronized data is available on the client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=moveFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name to apply.&lt;br /&gt;
* &amp;lt;code&amp;gt;newPath&amp;lt;/code&amp;gt; - The new target path to apply, relative to the root folder.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object in case of a successful move. The client should perform the move operation locally afterwards, then enter a normal synchronization cycle to acknowledge any changes.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://local.ox/ajax/drive?action=moveFile&amp;amp;root=163162&amp;amp;apiVersion=6&amp;amp;path=%2f&amp;amp;name=wurst.txt&amp;amp;checksum=f04e78d909d69a8463afd9e4dd159dcc&amp;amp;newName=wurst2.txt&amp;amp;session=213306bec07644ae9b6cc6a16d2be022&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (43.6119 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Flags)]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=23267</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=23267"/>
		<updated>2017-05-05T06:58:10Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API], the basic conventions for exchanging messages described there are also valid for this case, especially the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (low level protocol)] and [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (login module)].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since API version 5) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter if suitable.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, if the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-file is smaller than a certain threshold (the contents may still be requested with an explicit download then).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Synchronize files for multiple folders ==&lt;br /&gt;
&lt;br /&gt;
Utilizing the [[HTTP_API#Module_.22multiple.22|multiple]] request, it is possible to execute multiple &amp;quot;syncfiles&amp;quot; requests in parallel. Especially during an initial synchronization and in combination with &amp;quot;inline&amp;quot; mode for .drive-meta files, this may reduce the number of necessary requests. Therefore, the parameters and file versions of each &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request are serializied into a JSON array of the &amp;lt;code&amp;gt;multiple&amp;lt;/code&amp;gt;-request body. In the same way, the response contains the resulting actions of each &amp;quot;syncfiles&amp;quot; result in an JSON array of the response.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of executing three &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; actions inside a single &amp;lt;code&amp;gt;mutliple&amp;lt;/code&amp;gt; request:&lt;br /&gt;
&lt;br /&gt;
 ==&amp;gt; PUT http://local.ox/ajax/multiple?session=0833ca06093a4bad826347a30bf7ace7&amp;amp;continue=true&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     }]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (92.2341 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;e9000b2444dfbc780f91df6586e24615&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1663,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;33&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 3,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723311033,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723311019,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 5,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723313260,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 8,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723316567,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723316551,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;4&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;edit&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1467622558800&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;c4ca4238a0b923820dcc509a6f75849b&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458723332449&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;46114c4a55ed74b836da0fd83809fb06&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 2531,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103432&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 20,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1460443249927,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1459842066104&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;7c1e3c12567f8279dff97faee04af9c2&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 4421093,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1460443249927&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;ba45c8f60456a672e003a875e469d0eb&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 845941,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785226&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 595284,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785374&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;9829c1949b6347cec22467e34b0814dd&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 438,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103434&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 22,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: []&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1465453273921&lt;br /&gt;
       }]&lt;br /&gt;
     }]&lt;br /&gt;
	 &lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (token login)] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;cascadePermissions/code&amp;gt; (optional, available since API version 7) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, permission changes are also applied to all subfolders recursively.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Folder Data)]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Infoitem Data)]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get trash folder statistics ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets statistics about the trash folder contents. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=trashStats&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the recursively accumulated folder statistics as described in [[#FolderStats|Folder Statistics]] below. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FolderStats&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Folder Statistics&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| totalSize || Number || The total size of the contents in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| numFiles || Number || The total number of contained files.&lt;br /&gt;
|-&lt;br /&gt;
| numFolders || Number || The total number of contained folders.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=trashStats&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (64.2423 ms elapsed, 67 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 30904580,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 39,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 4&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Empty trash folder ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Empties the trash folder, i.e. permanently removes any contained files and folders. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=emptyTrash&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the updated folder statistics after the trash was emptied as described in [[#FolderStats|Folder Statistics]]. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=emptyTrash&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 0&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Autocomplete contacts ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Performs a &amp;quot;starts-with&amp;quot; search to find users, contacts and groups, e.g. to look up recipients when sharing a folder or item. &amp;lt;br /&amp;gt; &lt;br /&gt;
Prior triggering the request, clients should check the user input against the configured value of &amp;lt;code&amp;gt;minSearchChars&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; - The query to search for (no need to include additional wildcards).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding the found users, contacts and groups. Each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)], without the &amp;quot;bits&amp;quot; property set. For external contacts, the fields &amp;quot;entity&amp;quot; and &amp;quot;type&amp;quot; are also not set.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=autocomplete&amp;amp;query=tes&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test1@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test1&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test1&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 1&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 6&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test4@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=13&amp;amp;timestamp=1453973021020&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 4&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 13&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test@example.org&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;Test&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;Otto&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/contact/picture?folder=31&amp;amp;id=118493&amp;amp;timestamp=1465481052986&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test, Otto&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 3851,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;group&amp;quot;,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test Group&amp;quot;&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Move/Rename a Directory ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 6. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Explicitly performs a move or rename operation for a directory. This method is intended for the situation when no phsyical copy of the synchronized data is available on the client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=moveFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;newPath&amp;lt;/code&amp;gt; - The new target path to apply, relative to the root folder.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object in case of a successful move. The client should perform the move operation locally afterwards, then enter a normal synchronization cycle to acknowledge any changes.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://local.ox/ajax/drive?action=moveFolder&amp;amp;root=163114&amp;amp;apiVersion=6&amp;amp;path=%2ftest&amp;amp;checksum=57ff72d92073bac92f13791bf4e7baf4&amp;amp;newPath=%2ftest3&amp;amp;session=9eabd980fead41d4ac81d32f6c86da5b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (90.064 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Move/Rename a File ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 6. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Explicitly performs a move or rename operation for a file. This method is intended for the situation when no phsyical copy of the synchronized data is available on the client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=moveFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name to apply.&lt;br /&gt;
* &amp;lt;code&amp;gt;newPath&amp;lt;/code&amp;gt; - The new target path to apply, relative to the root folder.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object in case of a successful move. The client should perform the move operation locally afterwards, then enter a normal synchronization cycle to acknowledge any changes.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://local.ox/ajax/drive?action=moveFile&amp;amp;root=163162&amp;amp;apiVersion=6&amp;amp;path=%2f&amp;amp;name=wurst.txt&amp;amp;checksum=f04e78d909d69a8463afd9e4dd159dcc&amp;amp;newName=wurst2.txt&amp;amp;session=213306bec07644ae9b6cc6a16d2be022&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (43.6119 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Flags)]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=23132</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=23132"/>
		<updated>2017-03-16T10:57:38Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific cirumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stabilty for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests beloning to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page.&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a name and password needs to be defined. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
 # The password used when joining the cluster. Defaults to &amp;quot;wtV6$VQk8#+3ds!a&amp;quot;. &lt;br /&gt;
 # Please change this value, and ensure it's equal on all nodes in the cluster.&lt;br /&gt;
 com.openexchange.hazelcast.group.password=wtV6$VQk8#+3ds!a&lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the &lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes) or &amp;quot;multicast&amp;quot; (automatic &lt;br /&gt;
 # discovery of other nodes via multicast). Defaults to &amp;quot;empty&amp;quot;. Depending on &lt;br /&gt;
 # the specified value, further configuration might be needed, see &amp;quot;Networking&amp;quot;&lt;br /&gt;
 # section below. &lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as decribed in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.group.password=secret&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferrably not be used to server client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning (preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being desgined to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom paritioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom paritioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own paritioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom paritioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session mirgration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionaly a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed witht the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
== Upgrading a single Node ==&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
== Upgrades of the Hazelcast library ==&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''.&lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utitlty as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
== Other Considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode&amp;diff=22515</id>
		<title>AppSuite:Sharing and Guest Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode&amp;diff=22515"/>
		<updated>2016-11-10T10:33:57Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: /* Session Lifecycle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Sharing and Guest Mode&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Starting with v7.8.0, the Open-Xchange server comes with a whole new concept to share contents with external people, allowing guest users to interact with the shared data in the same way as regular groupware users do. This article describes the underlying technical implications and outlines the different use cases.&lt;br /&gt;
&lt;br /&gt;
The main idea behind the new sharing concept is that guest users, i.e. external users without a regular account on the server, should be able to access the shared contents using the existing interfaces, especially the App Suite web interface. On the one hand, this includes consuming the shared data using the App Suite's advanced media viewing capabilities. On the other hand, this enables guests to edit existing as well as to create or upload new content in the groupware. Even real-time collaboration between internal users and guests in OX Documents is possible.&lt;br /&gt;
&lt;br /&gt;
The following chapters cover different topics regarding sharing and guest users and try to describe some technical background and impact where hosters, administrators or integrators might be interested in.&lt;br /&gt;
&lt;br /&gt;
== Creating Shares ==&lt;br /&gt;
&lt;br /&gt;
Basically, creating a share means adding an additional permission entity to the shared folder or item. Previously, this was only possible for &amp;amp;quot;internal&amp;amp;quot; entities, i.e. regular users or user groups. Now, the underlying permission system has been extended to support external entities, which can be either invited guest users, or special &amp;amp;quot;anonymous&amp;amp;quot; guest users who access a shared folder or item via a secret link. Anonymous and invited guest users are explained in more detail below.&lt;br /&gt;
&lt;br /&gt;
Sharing is available for the groupware modules Calendar, Contacts, Tasks and Drive (a.k.a. Infostore/Files). While the latter one also allows &amp;quot;writable&amp;quot; access for invited guest users, folders from the Calendar, Contacts and Tasks module may only be published in &amp;quot;read-only&amp;quot; mode to external guests.&lt;br /&gt;
&lt;br /&gt;
=== Invite Guests ===&lt;br /&gt;
&lt;br /&gt;
To share something to a guest user, it's possible to just add the e-mail address of the invitee as new permission entity for files and folders. The middleware then takes care to provision a new or reuse an existing account for the guest user, and equips him with the required permissions for accessing the contents. So, from a client's point of view, sharing something to a guest user is mostly the same process as sharing something to an internal user or group.&lt;br /&gt;
&lt;br /&gt;
=== Share Links ===&lt;br /&gt;
&lt;br /&gt;
Besides explicitly inviting a guest user to a share, it's also possible to just get a secret link for a folder or item. This will result in an additional &amp;amp;quot;anonymous&amp;amp;quot; guest entity in the permissions of the shared object, and will grant any user with the corresponding share link access the shared contents. To simplify the creation of share links, the clients will offer an additional &amp;amp;quot;wizard&amp;amp;quot; to quickly get a share link for a folder or item. Unlike invited guests which behave much like internal users, anonymous guest entities are strictly bound to the underlying folder or item, i.e. there is at most one anonymous permission entity per file or folder, as well as an anonymous permission entity can only be used for only once.&lt;br /&gt;
&lt;br /&gt;
=== Required Permissions and Capabilities ===&lt;br /&gt;
&lt;br /&gt;
Whether a user is allowed to create share links, invite external guests, or internal groups or users, depends on the following module access permissions and capabilities. Please note that share links no longer require &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt; since Open-Xchange v7.8.1; this restriction was removed in order to allow simple publications also for non-groupware accounts, e.g. as defined by the &amp;lt;code&amp;gt;pim&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;pim_infostore&amp;lt;/code&amp;gt; module access combinations.&lt;br /&gt;
&lt;br /&gt;
==== v7.8.0 ====&lt;br /&gt;
* Create, update &amp;amp; remove share links: &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove internal users and group permissions: &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove external guest permissions: &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v7.8.1 ====&lt;br /&gt;
* Create, update &amp;amp; remove share links: &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove internal users and group permissions in modules Calendar, Contacts, Tasks: &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt; for personal / &amp;lt;code&amp;gt;edit_public_folders&amp;lt;/code&amp;gt; for public folders&lt;br /&gt;
* Add, update or remove internal users and group permissions in module Drive: none&lt;br /&gt;
* Add, update or remove external guest permissions in modules Calendar, Contacts, Tasks: &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt; for personal / &amp;lt;code&amp;gt;edit_public_folders&amp;lt;/code&amp;gt; for public folders&lt;br /&gt;
* Add, update or remove external guest permissions in module Drive: &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Existing shares for a guest user or context may be listed using the commandline utility &amp;lt;code&amp;gt;listshares&amp;lt;/code&amp;gt;&lt;br /&gt;
* The ability to create share links may be controlled via &amp;lt;code&amp;gt;com.openexchange.capability.share_links&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;permissions.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The ability to invite guest users may be controlled via &amp;lt;code&amp;gt;com.openexchange.capability.invite_guests&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;permissions.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The number of allowed share links per user may be specified via &amp;lt;code&amp;gt;com.openexchange.quota.share_links&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The number of allowed guest invitations per user may be specified via &amp;lt;code&amp;gt;com.openexchange.quota.invite_guests&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* Both quotas can also be set on a per-context basis via a 'changecontext' call and the &amp;lt;code&amp;gt;quota-module&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;quota-value&amp;lt;/code&amp;gt; options, see [http://oxpedia.org/wiki/index.php?title=AppSuite:Context_management#changecontext]. The module IDs are accordingly &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Quotas are always checked per-user, per default both are set to 100. You'll probably want to increase the quota for links when enabling the link mail feature available with OX App Suite 7.8.2.&lt;br /&gt;
&lt;br /&gt;
== Removing Shares ==&lt;br /&gt;
&lt;br /&gt;
The lifetime of shares is implicitly bound to the lifetime of the associated permission of the guest user entity. So, once a permission entity pointing to a (named or anonymous) guest user account is removed from the parent folder or item, this also leads to the removal of the associated share itself. Afterwards, the contents are no longer accessible for the guest user. For shares that were created with a specific expiry date, it is ensured that they can no longer be accessed via their share link after expiring. Additionally, expired shares are cleaned up periodically within a background task.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Shares may be revoked manually using the commandline utility &amp;lt;code&amp;gt;removeshares&amp;lt;/code&amp;gt;&lt;br /&gt;
* The interval of the periodic cleanup task can be controlled via &amp;lt;code&amp;gt;com.openexchange.share.cleanup.periodicCleanerInterval&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Share Links &amp;amp;amp; Tokens ==&lt;br /&gt;
&lt;br /&gt;
Shares are accessed with a hyperlink that contains the so-called share &amp;amp;quot;token&amp;amp;quot;. This 24-byte token uniquely identifies the associated guest account on the system, and carries enough randomness that it can't be guessed. Explicitly invited guest users receive this hyperlink in the invitation mail to a share, while in case of an &amp;amp;quot;anonymous&amp;amp;quot; share where just the link itself was generated, it's up to the sharing user to distribute the link on his own. Besides the token, a share link may contain an additional path that points to the concrete folder and item, which just aids to jump to the shared item in the web interface directly. The following shows an example of a share link:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://share.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/1/2/ODAxMDY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a guest user has been invited to more than one share in a context (based on his e-mail address), his individual share token remains equal, so that he will have access to all shared contents in the web interface after following any of the share links he received. However, the additional &amp;amp;quot;path&amp;amp;quot; still points to the concrete item. When inviting more than one guest user to the same share, each recipient will get his own individual share link.&lt;br /&gt;
&lt;br /&gt;
Once the share URL is requested from the server, the associated guest account is looked up and, depending of the guest type, the request is redirected to a specific login screen or directly into the App Suite web interface. More details regarding the different login modes are described at [[#Guest_Login_&amp;amp;_Session_Handling|Guest Login &amp;amp;amp; Session Handling]].&lt;br /&gt;
&lt;br /&gt;
After a share has been revoked (either explicitly, by removing the permission, or if the share is expired), share links can't be accessed any longer, and, after the last share for the guest user was removed, the guest account is removed from the system automatically.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The share token is stored as user attribute &amp;lt;code&amp;gt;com.openexchange.shareBaseToken&amp;lt;/code&amp;gt; in the corresponding guest user account&lt;br /&gt;
* The target database schema for a share and the associated guest account is extracted from the context identifier encoded in the share token&lt;br /&gt;
&lt;br /&gt;
== Guest Users ==&lt;br /&gt;
&lt;br /&gt;
As outlined above, guest users are created on demand once something is being shared. We basically distinguish between two types of guest users: Those that were invited explicitly by the sharing user, or &amp;amp;quot;anonymous&amp;amp;quot; guest users that are able to access by visiting the share link. Access for the latter one may optionally be secured with a fixed PIN code.&lt;br /&gt;
&lt;br /&gt;
For both kinds of guest users, a corresponding user account is provisioned dynamically on the system once a new share is created. Such a guest account is handled much similar as an account for a regular user, with the following main exceptions:&lt;br /&gt;
&lt;br /&gt;
* No access to the &amp;amp;quot;Mail&amp;amp;quot; module&lt;br /&gt;
* No personal folders&lt;br /&gt;
* No access to the &amp;amp;quot;Portal&amp;amp;quot;&lt;br /&gt;
* No access to the global address book&lt;br /&gt;
* Module access is restricted to only include modules from the actual shares&lt;br /&gt;
&lt;br /&gt;
All those restrictions are configured and enforced using the built-in mechanisms of the Open-Xchange Server, i.e. by a reduced set of capabilities (i.e. module permissions), or by selectively set permission bits in the folder tree for the virtual guest group. This ensures that guest users are only able to access things they explicitly have been invited to, as well as a transparent handling of guest accounts within all subsystems.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Guest users are stored much similar as regular users in the database (tables &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prg_contacts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_attribute&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_configuration&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Additionally, the identifier of the user who (initially) created the guest account is stored in &amp;lt;code&amp;gt;user.guestCreatedBy&amp;lt;/code&amp;gt;, i.e. if this column is not &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, this entry refers to a guest user&lt;br /&gt;
* All service calls and APIs that list or search users have been adjusted to be &amp;amp;quot;guest-aware&amp;amp;quot;, i.e. by default, guests users are not included in the output, yet may be included explicitly with additional parameters (namely &amp;lt;code&amp;gt;includeGuests&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;excludeUsers&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Service calls and APIs that request data explicitly based on an entity's identifier are also working with guest users, i.e. if a specific idnetifier points to a guest, then the referenced guest data is returned&lt;br /&gt;
&lt;br /&gt;
=== Capabilities ===&lt;br /&gt;
&lt;br /&gt;
Guest users always have the &amp;lt;code&amp;gt;guest&amp;lt;/code&amp;gt; capability set. Besides they are generally configured with a limited permission set, that allows them just to work with their shared items. This permission set includes:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Permission&lt;br /&gt;
!Capability&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;deniedportal&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|No &amp;lt;code&amp;gt;portal&amp;lt;/code&amp;gt; capability&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;editpublicfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;edit_public_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;editpassword&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;edit_password&amp;lt;/code&amp;gt;&lt;br /&gt;
|Only for invited guests, not links&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Additionally, for every module the guest is having shared items in, the according module permission is granted, e.g. a shared drive folder results in permission &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt; and the according capability. Guest users are never allowed to share folders or items on their own, i.e. the capabilities &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt; can never be set.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
This limited capability set can be extended by configuration. Currently three modes are supported:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Mode&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|deny_all&lt;br /&gt;
|No further capabilities are applied to guest users, except ones that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|static&lt;br /&gt;
|A static list of capabilities is applied to guest users via the &amp;lt;code&amp;gt;com.openexchange.share.staticGuestCapabilities&amp;lt;/code&amp;gt; property. Additionally capabilities that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt; are applied.&lt;br /&gt;
|-&lt;br /&gt;
|inherit&lt;br /&gt;
|All capabilities of the user who &amp;amp;quot;created&amp;amp;quot; the guest, i.e. created the link or initially invited somebody, are applied to the guest user. Additionally capabilities that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt; are applied.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The mode can be configured via the &amp;lt;code&amp;gt;com.openexchange.share.guestCapabilityMode&amp;lt;/code&amp;gt; property in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;. This property is config-cascade capable, so it can for example be overridden for certain sets of contexts. The same applies to the &amp;lt;code&amp;gt;com.openexchange.share.staticGuestCapabilities&amp;lt;/code&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
Due to this configuration mechanism it is possible to increase the user experience for guests and even allow some real collaboration. As an example one could apply the following configuration to allow guests to see preview images of files and edit shared documents with OX Text and OX Spreadsheet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;com.openexchange.share.guestCapabilityMode = static&lt;br /&gt;
com.openexchange.share.staticGuestCapabilities = document_preview, text, spreadsheet&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anonymous Guest Users ===&lt;br /&gt;
&lt;br /&gt;
If a &amp;amp;quot;share link&amp;amp;quot; is created, this results in an implicit creation of an anonymous guest user account on the server. The &amp;amp;quot;secret&amp;amp;quot; to access the shared contents is the share token itself that is encoded in the generated share link, so that everybody that knows the share link is able to access the shared contents. Optionally, such an anonymous share link may be secured with an additional PIN code. Guest users will be prompted to enter this PIN code when attempting to access the share.&lt;br /&gt;
&lt;br /&gt;
To have a strict separation between different shared contents, each time a folder or item is shared using the &amp;amp;quot;Get a link&amp;amp;quot; method, a designated anonymous guest account for this share is used. Consequently, each time such an anonymous share is revoked, this guest account is terminated again with no further delay. Additionally, such an anonymous guest entity can only be applied to the permission set of the folder or item the original link was created for, i.e. it's not possible to add more shared contents to an anonymous guest - in contrast to an invited, named guest user.&lt;br /&gt;
&lt;br /&gt;
Besides the common restrictions for guest accounts outlined above, the following applies for anonymous guest user accounts:&lt;br /&gt;
&lt;br /&gt;
* No e-mail address or display name&lt;br /&gt;
* No password, if no PIN was assigned by the sharing user&lt;br /&gt;
* A password that may only be changed by editing the link, if a PIN code was set&lt;br /&gt;
* Anonymous guest users may only receive &amp;amp;quot;read-only&amp;amp;quot; access permissions to the shared item&lt;br /&gt;
* Optionally, an expiry date can be applied for an anonymous guest user after which the share link is no longer accessible&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The PIN code for anonymous guest users is stored using symmetrical encryption in the database, therefore, an encryption key needs to be specified via the property &amp;lt;code&amp;gt;com.openexchange.share.cryptKey&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Named Guest Users ===&lt;br /&gt;
&lt;br /&gt;
Internal users are able to invite a guest user to a folder or item explicitly by specifying the e-mail address of the recipient. Such &amp;amp;quot;named&amp;amp;quot; guest users are internally stored as individual guest users, identified by their e-mail address.&lt;br /&gt;
&lt;br /&gt;
If data is shared for the first time to the recipient in the context, a new guest user account is provisioned and an initial set of user permissions and capabilities is assigned. In case there are already shares in different contexts to the same recipient (based on his e-mail address), some existing user data like a display name or an assigned password is copied over if a cross-context database is available on the system.&lt;br /&gt;
&lt;br /&gt;
If the recipient has already been invited from the same or another internal user in the context to another share before, the new share is added to the guest user in a way that the underlying folder- and object permissions are taken over, and the user capabilities getting expanded as needed to cover all modules the shares are located in. Similarly, if a share to a named guest user is revoked and the underlying folder- and object-permissions are removed, the guest user capabilities are updated implicitly to reflect the modules of the remaining shares.&lt;br /&gt;
&lt;br /&gt;
After the last share to a named guest user has been revoked, the user has no longer access to any data. The account itself gets removed from the context automatically after a configurable expiry time. Additionally, any data that is stored for the guest user in the cross-context database is removed once the guest user has been deleted from all contexts in the system.&lt;br /&gt;
&lt;br /&gt;
In contrast to an &amp;amp;quot;anonymous&amp;amp;quot; guest user, a named guest user has access to all shared items from a context after logging in, since the permissions get added to an existing guest user account automatically. For entering the web interface, he may use any of the share links that were sent to him in the different notification messages. Those links usually point to an individual share target like a folder or file, but the guest user may navigate to the other shared contents using the folder tree of the web interface in the same way as regular groupware users do. Similarly, if the guest user has access to shares from different modules, the modules can be switched in the web interface as usual.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The timespan after which an unused named guest user should be removed from the system can be configured via &amp;lt;code&amp;gt;com.openexchange.share.cleanup.guestExpiry&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt; - this value may also be set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to force an immediate removal&lt;br /&gt;
* For the removal of no longer needed guest user accounts, a periodical cleanup task is scheduled based on the interval of &amp;lt;code&amp;gt;com.openexchange.share.cleanup.periodicCleanerInterval&amp;lt;/code&amp;gt;&lt;br /&gt;
* Whether a cross-context database is considered for guest users may be configured via &amp;lt;code&amp;gt;com.openexchange.share.crossContextGuests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Guest Login &amp;amp;amp; Session Handling ==&lt;br /&gt;
&lt;br /&gt;
Based on the underlying guest user account, different login operations with different authentication workflows are possible.&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
&lt;br /&gt;
We have basically three different authentication options for guest users accessing a share, each of them having their own characteristics.&lt;br /&gt;
&lt;br /&gt;
==== Anonymous ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted without providing additional authentication information, the knowledge of the link is sufficient&lt;br /&gt;
* When accessing the share link, a guest session is spawned implicitly&lt;br /&gt;
* Initially supplied cookies are considered to recycle an existing session&lt;br /&gt;
* The login screen is skipped, we'll redirect to the module/folder/item directly (using appropriate URL fragments)&lt;br /&gt;
&lt;br /&gt;
==== Anonymous with PIN ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted for anonymous guest users providing a password / PIN code&lt;br /&gt;
* When accessing the share link, the client is redirected to the login screen of the webinterface, using &amp;lt;code&amp;gt;login_type=anonymous&amp;lt;/code&amp;gt;&lt;br /&gt;
* User can then enter his PIN code, client executes the &amp;lt;code&amp;gt;anonymous_login&amp;lt;/code&amp;gt; method, server authenticates, sends back a login response containing the target in the app suite webinterface (module/folder/item)&lt;br /&gt;
* Password can't be changed by an anonymous user&lt;br /&gt;
* Password can be re-constructed / changed by sharing user&lt;br /&gt;
&lt;br /&gt;
==== Guest without Password ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted without providing additional authentication information, the knowledge of the guest's individual link is sufficient&lt;br /&gt;
* When accessing the share link, a guest session is spawned implicitly&lt;br /&gt;
* Exiting cookies are considered to recycle an existing session&lt;br /&gt;
* The login screen is skipped, we'll redirect to the module/folder/item directly (using appropriate URL fragments)&lt;br /&gt;
* Guest user may choose an individual password at a later stage&lt;br /&gt;
&lt;br /&gt;
==== Guest with Password ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted for guest users providing a user name and password.&lt;br /&gt;
* Much similar to a regular groupware user&lt;br /&gt;
* When accessing the share link, the client is redirected to the login screen of the webinterface, using &amp;lt;code&amp;gt;login_type=guest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;login_name=&amp;amp;lt;NAME&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* The login name is used to pre-fill the username input&lt;br /&gt;
* User can then enter his password, client executes the &amp;lt;code&amp;gt;guest_login&amp;lt;/code&amp;gt; method, server authenticates, sends back a login response containing the target in the app suite webinterface (module/folder/item)&lt;br /&gt;
* Password can be changed by guest user&lt;br /&gt;
* Guest user may reset his password if he can't remember&lt;br /&gt;
&lt;br /&gt;
=== Guest Hostname ===&lt;br /&gt;
&lt;br /&gt;
For serving shares, a separate guest hostname needs to be configured. This is mainly required to prevent guest- and regular user sessions using the same cookie container when logged in in the same client (otherwise, the cookie holding the alternative session identifier as well as other cookies would get overwritten concurrently). Additionally, this allows to have separate entry points to the web client for guest- and regular users. &lt;br /&gt;
&lt;br /&gt;
The hostname for guests is used when generating external share links, as well as at other locations where hyperlinks are constructed in the context of guest users. Usually, the guest hostname refers to a separate subdomain of the installation like &amp;lt;code&amp;gt;share.example.com&amp;lt;/code&amp;gt;, and is defined as an additional named virtual host pointing to the web client's document root in the webserver's configuration. &lt;br /&gt;
&lt;br /&gt;
Once the webserver configuration is done and the web client is accessible using the guest hostname, this hostname needs to be specified in the backend configuration, too. In simple scenarios, where a fixed guest hostname should be used for the installation, this can be done statically in a configuration file. This setting may also be overridden per context via the Config Cascade. In case a dedicated hostname service is installed (for example &amp;lt;code&amp;gt;open-xchange-hostname-ldap&amp;lt;/code&amp;gt;), this hostname service is also supposed to supply the guest hostname. &lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The guest hostname may be specified via &amp;lt;code&amp;gt;com.openexchange.share.guestHostname&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The guest hostname may also be supplied via dedicated hostname services like &amp;lt;code&amp;gt;open-xchange-hostname-config-cascade&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;open-xchange-hostname-ldap&amp;lt;/code&amp;gt;&lt;br /&gt;
* For test purposes, guests may also access the web interface using the same host as regular users do, however, this might lead to unexpected results (missing images, sessions timing out, auto-login malfunction...)&lt;br /&gt;
&lt;br /&gt;
=== Cookies ===&lt;br /&gt;
&lt;br /&gt;
Guest sessions basically make use of the same cookies as regular user sessions do. This includes the JSESSONID cookie for the JVM route, as well as the &amp;lt;code&amp;gt;open-xchange-secret-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-public-session-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; cookies. Additionally, if configured, the client may also issue a &amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt; request to persist the open-xchange-session-&amp;lt;hash&amp;gt; cookie. This cookie may then be used to auto-login the guest client into the previously used session if it is still valid.&lt;br /&gt;
&lt;br /&gt;
Besides the common cookies, another special cookie is set: &amp;lt;code&amp;gt;open-xchange-share-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt;. The value contains the unique share token bound to the guest user accessing the share. here, the cookie hash is calculated as it's done for ordinary sessions, so that there can only be one &amp;lt;code&amp;gt;open-xchange-share-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; cookie in a client at the same time. Whenever an auto-login request is issued by the client, the server checks for the existence of this &amp;amp;quot;share&amp;amp;quot; cookie, and, once recognized and checked for validity, it will try to perform the auto-login for an existing guest session first, i.e. using the session cookie based on the special guest hash calculation outlined above. Otherwise, the common auto-login process takes place. The &amp;amp;quot;share&amp;amp;quot; cookie is removed once the guest session terminates, i.e. the guest user logs out.&lt;br /&gt;
&lt;br /&gt;
Since guest users access the web interface on a separate (sub)domain (see [[#Guest_Hostname|Guest Hostname]] above for details), guest session cookies won't interfere with cookies of a regular session on the same client. This allows to use the regular user session as well as one or more guest sessions in parallel - e.g. if the sharing user quickly wants to check how the contents appear for the guest user after generating a share link.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Whether guest sessions are enabled for auto-login is configurable via the property &amp;lt;code&amp;gt;com.openexchange.share.autoLogin&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* By default, the cookie TTL for guest sessions is inherited from the TTL for cookies of regular sessions as defined by &amp;lt;code&amp;gt;com.openexchange.cookie.ttl&amp;lt;/code&amp;gt; - this default may be overridden by defining a timespan at &amp;lt;code&amp;gt;com.openexchange.share.cookieTTL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Login Modes ===&lt;br /&gt;
&lt;br /&gt;
When accessing a share link, one of the following login modes is triggered to acquire a session and forward the client to the share target. The executed login operation and redirect depends on the authentication mode of underlying guest account, the share target iteself, and the client accessing the share.&lt;br /&gt;
&lt;br /&gt;
==== Redirect to Target ====&lt;br /&gt;
&lt;br /&gt;
In case a share is accessible without providing credentials, the client is redirected to the share target directly, i.e. without prompting for a username or password. By default, the client is redirected to the target in the App Suite web interface by responding the &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; request to the share link with &amp;lt;code&amp;gt;HTTP 302&amp;lt;/code&amp;gt;, and a location header like the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;session=80c711019d6f48b5bec9cd82758e3308&amp;amp;amp;store=true&amp;amp;amp;user=&amp;amp;amp;user_id=642&amp;amp;amp;context_id=1&amp;amp;amp;m=files&amp;amp;amp;f=41042&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The session for the guest user is created implicitly in the backend after checking the share link's validity, and the client is instructed to store appropriate cookies in the redirect response, including the &amp;amp;quot;share&amp;amp;quot; cookie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-secret-aNobP2G9wLHJ6sMr7vtTA=38ee770d6e4f42ab8366d91db3279931; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-public-session-d0759656127fb7cee6e0fe8bb5fe19f9=cae6a3e712ac429e9da9194abd389cb3; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-share-b7gDSqJpnh9gS3Fs52I65Q=0ad50ac00418fbcdad50ac1418f94fb181d51b8fa7b2bde3; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirect to Login Screen ====&lt;br /&gt;
&lt;br /&gt;
If additional credentials, i.e. an additional PIN code or username/password combination, are required to access a share target, and no &amp;amp;quot;special client&amp;amp;quot; like an iCal consumer is detected by the backend, the client is redirected to the login screen of the app suite webinterface. The GET request to the share link is answered with statuscode HTTP 302, and a location header depending on the required credentials to access the share.&lt;br /&gt;
&lt;br /&gt;
If the share ought to be accessed anonymously, but protected by a PIN code, a location like the following is added to the response header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;share=08b4b6110151f1bd7d4b610151f0405d9fc8bb89a887f04e&amp;amp;amp;login_type=anonymous&amp;amp;amp;message_type=INFO&amp;amp;amp;message=Tony%20Parker%20has%20shared%20the%20folder%20%22Pictures%22%20with%20you.%20Please%20log%20in%20to%20view%20it.%20&amp;amp;amp;target=151ebb38&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For shares to dedicated guest users identified by their e-mail address, the redirect location looks like follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;share=4ac9eb590f9ca4d2ac9eb58f9ca611ec9b4f4638d288c8c0&amp;amp;amp;login_type=guest&amp;amp;amp;message_type=INFO&amp;amp;amp;message=Tony%20Parker%20has%20shared%20the%20file%20%22Agenda.pdf%22%20with%20you.%20Please%20log%20in%20to%20view%20it.%20&amp;amp;amp;login_name=ray%40example.com&amp;amp;amp;target=4444cbc7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The redirect response already contains the &amp;lt;code&amp;gt;Set-Cookie&amp;lt;/code&amp;gt; header for the JVM route. On the redirect target, the client should request the PIN code or password from the user, and then issue a special login request, supplying the share token and optional target from the URL parameters, and the password as URL encoded form data in the request body, similar to the usual login request via POST. After successful authentication, the login response includes, along with the common login response properties like the session identifier, information about the share target being accessed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;amp;quot;session&amp;amp;quot;:&amp;amp;quot;b89af2c2ce494ce4b4573c0632b48e89&amp;amp;quot;,&amp;amp;quot;user&amp;amp;quot;:&amp;amp;quot;ray@example.com&amp;amp;quot;,&amp;amp;quot;user_id&amp;amp;quot;:660,&amp;amp;quot;context_id&amp;amp;quot;:1,&amp;amp;quot;locale&amp;amp;quot;:&amp;amp;quot;en_US&amp;amp;quot;,&amp;amp;quot;module&amp;amp;quot;:&amp;amp;quot;files&amp;amp;quot;,&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;10&amp;amp;quot;,&amp;amp;quot;item&amp;amp;quot;:&amp;amp;quot;10/456398&amp;amp;quot;, ... }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the client is instructed to store the secret cookies:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-share-b7gDSqJpnh9gS3Fs52I65Q=0ac9eb590f9ca4d5ac9eb58f9ca641ec9b4f4638d288c8a0; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-secret-MBIRg9bJBLduCcosqQBCw=70187de16f844be6880c18be373b953d; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-public-session-d0759656127fb7cee6e0fe8bb5fe19f9=4e797a59758a4dd7b763912472ccf26d; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afterwards, the client is able to use the session to access the share target as usual.&lt;br /&gt;
&lt;br /&gt;
=== Session Lifecycle ===&lt;br /&gt;
&lt;br /&gt;
Generally, guest sessions on the server are treated just like the sessions of ordinary users. Especially, guest sessions are also held in the local session containers of the backend host they're associated with. However, by default guest sessions are marked as &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt;, i.e. they are not moved to the long-term session containers, nor they are put into the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
If OX Documents functionality is used for guest users in a cluster of application servers, this setting needs to be adjusted to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in order to also have guest sessions available in the distributed storage.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Guest sessions are also accounted in the monitoring outputs (e.g. in the sessions per container graphs)&lt;br /&gt;
* The &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt; handling of guest sessions may be changed via the property &amp;lt;code&amp;gt;com.openexchange.share.transientSessions&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logout ===&lt;br /&gt;
&lt;br /&gt;
Guest sessions are terminated once a logout request is issued by the client, i.e. the user clicks the &amp;amp;quot;Logout&amp;amp;quot; button in the web interface, just like it is done for regular sessions. Additionally, guest sessions expire in the backend when not being used for a while, the actual timeout depends on the configured default session lifetime and whether they are treated as &amp;amp;quot;transient&amp;amp;quot; or not, as explained above.&lt;br /&gt;
&lt;br /&gt;
Since guest users are not able to use the default login page for regular users, a custom logout location for guest users should be specified where guest users are taken to after clicking logout explicitly, or if their session expired.&lt;br /&gt;
&lt;br /&gt;
If a share is consumed &amp;amp;quot;directly&amp;amp;quot;, e.g. by downloading the binary contents of a file share directly (see [[#Consuming_Shares|Consuming Shares]] for details), the guest sessions is terminated instantly after serving the request.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The logout location for guest accounts can be customized via &amp;lt;code&amp;gt;guestLogoutLocation&amp;lt;/code&amp;gt; in the file &amp;lt;code&amp;gt;as-config.yml&amp;lt;/code&amp;gt; (see file &amp;lt;code&amp;gt;as-config-default.yml&amp;lt;/code&amp;gt; for an example)&lt;br /&gt;
&lt;br /&gt;
== Share Notifications ==&lt;br /&gt;
&lt;br /&gt;
With the new sharing concept, notification mails can be sent out to the permission entities (i.e. internal or guest users) of folders or items. Mechanisms exist to send out such mails implicitly or explicitly. Notifications are sent out implicitly, if externals are invited as guests and can also be sent out for internal invitations, if configured so. The client (e.g. App Suite UI) decides on its own whether implicit notifications shall be sent when updating a folders or items permissions. Besides there are separate API calls for sending out notification messages explicitly. Its on the client to provide this functionality to its users. This makes it possible to re-send a link to a folder or item to an existing permission entity.&lt;br /&gt;
&lt;br /&gt;
Sending out links to shared folders and items is not the only case for notification messages, it can also be necessary to send out system notifications to guest users. Currently this is the case when a guest user secured his account with a password and needs to reset that password, because he cannot remember.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* A special transport must be configured for system notifications and cases where the sharing user has no configured webmail account. This transport is configured in &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt;. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
* It is possible to disable the implicit notification of internal users about shared folders or items at all by setting &amp;lt;code&amp;gt;com.openexchange.share.notifyInternal&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The layout of notifications mails can be changed via &amp;lt;code&amp;gt;as-config.yml&amp;lt;/code&amp;gt;. All available properties are defined and explained in &amp;lt;code&amp;gt;as-config-defaults.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API Access ==&lt;br /&gt;
&lt;br /&gt;
From a client's point of view, guest users basically don't differ from regular users, although they usually have limited capabilities, for example no mail access or no personal folders. However, all those differences are reflected within the regular permission- and capability-concepts, so that existing clients, once the guest user is authenticated and has a valid session, continue to work transparently, and use the same API calls as with a regular groupware user.&lt;br /&gt;
&lt;br /&gt;
To create or manage shares and guest users, the HTTP API has been extended at various locations. The following list gives an overview about the changes, derived from the corresponding software change requests.&lt;br /&gt;
&lt;br /&gt;
=== Format change for object identifiers of the default &amp;amp;quot;infostore&amp;amp;quot; account ===&lt;br /&gt;
&lt;br /&gt;
As preparation for individual object permissions where a file can be accessed from different folder &amp;amp;quot;views&amp;amp;quot;, the object IDs for documents in the default &amp;amp;quot;infostore&amp;amp;quot; file storage account will get enhanced with the prefixing folder ID.&lt;br /&gt;
&lt;br /&gt;
The identifiers will now be of format &amp;lt;code&amp;gt;&amp;amp;lt;some numbers&amp;amp;gt;/&amp;amp;lt;more numbers&amp;amp;gt;&amp;lt;/code&amp;gt;. Object identifiers are already of type &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, so this change should usually be transparent to clients. However, there may be some clever clients out there that for example tried to interpret the string of numerical characters as number, so client developers should double-check their implementation for compatibility. They most likely would run into trouble when coping with non-infostore file storages anyway.&lt;br /&gt;
&lt;br /&gt;
=== Object permissions for files ===&lt;br /&gt;
&lt;br /&gt;
In order to define permissions on object-level, a new property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; for objects of type &amp;lt;code&amp;gt;infoitem&amp;lt;/code&amp;gt; is introduced. Each time the underlying folder permissions are not sufficient to access an item, those object permissions are taken into account. Object permissions are stored as an array of Object Permission objects as defined below within the detailed infoitem data, the column ID is &amp;lt;code&amp;gt;108&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Details about the JSON structure are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedInfoitemData HTTP API: Detailed Infoitem Data]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionObject HTTP API: Object Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionFlags HTTP API: Object Permission Flags]&lt;br /&gt;
&lt;br /&gt;
=== New field for &amp;amp;quot;user&amp;amp;quot; data: &amp;amp;quot;guest_created_by&amp;amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
A new property has been introduced for users that needs to be exposed in our HTTP API, too. The following property is added to the detailed user data object:&lt;br /&gt;
&lt;br /&gt;
* ID: 616&lt;br /&gt;
* Name: guest_created_by&lt;br /&gt;
* Type: Number&lt;br /&gt;
* Value: Contains the ID of the user who has created this guest in case this user represents a guest user; it is 0 for regular users&lt;br /&gt;
&lt;br /&gt;
The property is read-only and can't be removed or set by clients.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedUserData HTTP API: Detailed User Data]&lt;br /&gt;
&lt;br /&gt;
=== Extend folder- and object permissions for addressing external guests ===&lt;br /&gt;
&lt;br /&gt;
For sharing files- or folders to external guests, the folder- and object permission objects are extended with additional properties. Those extended properties can be set during creation or update of the parent folder or file. The underlying shares and guest user entities for the referenced recipients are created automatically along with folder/file creation/update. Afterwards, the external recipients appear as regular &amp;amp;quot;user&amp;amp;quot; entities in the permission arrays in subsequent &amp;amp;quot;get&amp;amp;quot; requests.&lt;br /&gt;
&lt;br /&gt;
Details about the extended JSON structure are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#PermissionObject HTTP API: Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionObject HTTP API: Object Permission Object]&lt;br /&gt;
&lt;br /&gt;
=== New Ajax module: share/management ===&lt;br /&gt;
&lt;br /&gt;
To work with shares, a new Ajax module is introduced.&lt;br /&gt;
&lt;br /&gt;
The available actions in the module are described at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Module_.22share.2Fmanagement.22_.28preliminary.2C_available_with_v7.8.0.29 HTTP API: Module share management]&lt;br /&gt;
&lt;br /&gt;
=== New column &amp;amp;quot;shareable&amp;amp;quot; in detailed infoitem data ===&lt;br /&gt;
&lt;br /&gt;
Clients want to know quickly if an infostore item is shareable or not. A new (read-only) property named &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt; of type Boolean with column identifier &amp;lt;code&amp;gt;109&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;detailed infoitem data&amp;amp;quot;. If &amp;amp;quot;true&amp;amp;quot;, the can be considered as shareable, i.e. the item's object permissions may be adjusted by the user.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedInfoitemData HTTP API: Detailed Infoitem Data]&lt;br /&gt;
&lt;br /&gt;
=== New action &amp;amp;quot;shares&amp;amp;quot; in module folder ===&lt;br /&gt;
&lt;br /&gt;
To provide an overview of all folders of a certain modules that are shared to others, a new &amp;lt;code&amp;gt;shares&amp;lt;/code&amp;gt; action is added to the Ajax module &amp;lt;code&amp;gt;folders&amp;lt;/code&amp;gt;. It returns all personal folders of a certain module that are shared to other entities.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Get_shared_folders_.28Since_7.8.0.2C_Preliminary.29 HTTP API: Get shared folders]&lt;br /&gt;
&lt;br /&gt;
=== New action &amp;amp;quot;shares&amp;amp;quot; in module infostore ===&lt;br /&gt;
&lt;br /&gt;
To provide an overview of all files that are shared to others, a new &amp;lt;code&amp;gt;shares&amp;lt;/code&amp;gt; action is added to the Ajax module &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt;. It returns all personal files that are shared to other entities.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Get_shared_infoitems_.28Since_7.8.0.2C_Preliminary.29 HTTP API: Get shared infoitems]&lt;br /&gt;
&lt;br /&gt;
=== New fields to retrieve extended permissions of files and folders ===&lt;br /&gt;
&lt;br /&gt;
Clients would like to have more details about permission entities folders directly. A new read-only property named &amp;lt;code&amp;gt;com.openexchange.share.extendedPermissions&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;Detailed folder data&amp;amp;quot;, with column identifier &amp;lt;code&amp;gt;3060&amp;lt;/code&amp;gt;. It basically contains the same as the regular &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; array, yet enhanced by resolved information about the user, group or guest entities as well as additional, sharing-related properties.&lt;br /&gt;
&lt;br /&gt;
Similarly, a new read-only property named &amp;lt;code&amp;gt;com.openexchange.share.extendedObjectPermissions&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;Detailed infoitem data&amp;amp;quot;, with column identifier &amp;lt;code&amp;gt;7010&amp;lt;/code&amp;gt;. It basically contains the same as the regular &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; array, yet enhanced by resolved information about the user, group or guest entities as well as additional, sharing-related properties.&lt;br /&gt;
&lt;br /&gt;
Further information about the JSON structure is available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ExtendedPermissionObject HTTP API: Extended Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ExtendedObjectPermissionObject HTTP API: Extended Object Permission Object]&lt;br /&gt;
&lt;br /&gt;
== Consuming Shares ==&lt;br /&gt;
&lt;br /&gt;
Depending on the shared contents and the requesting user agent, shares may be consumed in a couple of different ways. The concrete response to a request to the share URL is evaluated by the share servlet in the backend.&lt;br /&gt;
&lt;br /&gt;
=== App Suite ===&lt;br /&gt;
&lt;br /&gt;
The default handling for all shares is forwarding them to the App Suite web interface, where the shared contents are made available through the existing client. Based on the underlying guest account, the client is either forwarded to the login prompt, or taken directly to the share target if no credentials need to be provided. This process is described in more detail at [[#Guest_Login_&amp;amp;_Session_Handling|Guest Login &amp;amp;amp; Session Handling]].&lt;br /&gt;
&lt;br /&gt;
=== Direct Download ===&lt;br /&gt;
&lt;br /&gt;
Shares to a single file may also be downloaded directly by clients, without opening them in the web interface first. This is indicated by an additional parameter appended to the plain share link, and can be specified in the following ways:&lt;br /&gt;
&lt;br /&gt;
* Append &amp;lt;code&amp;gt;dl&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?dl=true&amp;lt;/code&amp;gt;&lt;br /&gt;
* Specify &amp;lt;code&amp;gt;delivery&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?delivery=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If accessing the item requires authentication, an unauthenticated request is responded with &amp;lt;code&amp;gt;HTTP 401 Unauthorized&amp;lt;/code&amp;gt;. The client then has to provide the correct credentials to access the share via basic authentication. If there's no dedicated username for the underlying guest account - i.e. an &amp;amp;quot;anonymous&amp;amp;quot; share link protected with a PIN code is accessed - only the password is checked, i.e. the client may then supply an arbitrary username in the basic authentication header like &amp;amp;quot;Guest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get iCal ===&lt;br /&gt;
&lt;br /&gt;
Shares to a single calendar- or task-folder may also be downloaded directly by clients as iCal files, without opening them in the web interface first. This standard format allows to consume event data directly using various calendaring clients, which often can be configured to subscribe an external calendar source.&lt;br /&gt;
&lt;br /&gt;
Once a share link to a calendar- or task-folder is requested by the client, the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt;- and &amp;lt;code&amp;gt;User-Agent&amp;lt;/code&amp;gt; headers of the request are evaluated. If the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; header is either set to &amp;lt;code&amp;gt;text/calendar&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text/iCal&amp;lt;/code&amp;gt;, or if the &amp;lt;code&amp;gt;User-Agent&amp;lt;/code&amp;gt; header denotes a well-known client like Microsoft Outlook or Mozilla Thunderbird w/ Lightning, the contents of the shared folder are converted to an iCal file that is directly written back in the response.&lt;br /&gt;
&lt;br /&gt;
To force the iCal output, an additional parameter may be appended to the plain share link:&lt;br /&gt;
&lt;br /&gt;
* Append &amp;lt;code&amp;gt;ical&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?ical=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If accessing the item requires authentication, an unauthenticated request is responded with &amp;lt;code&amp;gt;HTTP 401 Unauthorized&amp;lt;/code&amp;gt;. The client then has to provide the correct credentials to access the share via basic authentication. If there's no dedicated username for the underlying guest account - i.e. an &amp;amp;quot;anonymous&amp;amp;quot; share link protected with a PIN code is accessed - only the password is checked, i.e. the client may then supply an arbitrary username in the basic authentication header like &amp;amp;quot;Guest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The interval of task- and appointment data considered for conversion to iCal can be adjusted via &amp;lt;code&amp;gt;com.openexchange.share.handler.iCal.futureInterval&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;com.openexchange.share.handler.iCal.pastInterval&amp;lt;/code&amp;gt; in configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cross-context functionality ==&lt;br /&gt;
&lt;br /&gt;
As already mentioned in previous sections the administrator is able to configure if guests should be handled per context (default) or server wide by using the configuration parameter &amp;lt;code&amp;gt;com.openexchange.share.crossContextGuests&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the guests email address is used to recognize if there is already a registered user with the given address and aligns the stored password to the already existing guest user. In addition to the password (which is the most important parameter this feature is about) even the users contact data gets synchronized.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* To handle user and contact data across contexts boundaries the feature has to be enabled before a guest receives the first share. Guests that receive shares before the activation cannot be considered within the alignment process. Only latter shares will be considered.&lt;br /&gt;
* At the moment this feature does only sync user and contact related data (no shared content). If the user got two shares from different contexts he will only see shares related to the given link.&lt;br /&gt;
&lt;br /&gt;
== Publish/Subscribe vs. Sharing ==&lt;br /&gt;
&lt;br /&gt;
The upcoming sharing features are going to replace the previously used OXMF &amp;amp;quot;publications&amp;amp;quot;, allowing guest users to interact with the shared data in the same way as regular groupware users do. However, since the underlying concepts and their technical realization are completely different, a seamless migration between publications and shares is not possible without some drawbacks.&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview of the main discrepancies:&lt;br /&gt;
&lt;br /&gt;
* Custom templates for OXMF publication targets&amp;lt;br /&amp;gt;An adminsitrator/admin may have defined some custom publication targets that are using the published data in a special way. While shares would still make all the data available (mainly via the web interface), this would only be a drop-in replacement for the ordinary &amp;amp;quot;view the publication in a browser&amp;amp;quot; use case, but not for anything beyond that scope.&lt;br /&gt;
* Subscribe of publications&amp;lt;br /&amp;gt;Publications from one user can be added to another user's groupware using the &amp;amp;quot;subscribe&amp;amp;quot; functionality, making use of the embedded microformat data of publications (OXMF). For sharing, we will not have a similar feature in the first iteration, so migrating an existing publication to a share would also stop it from being subscribable.&lt;br /&gt;
* Deep links to download files of publications&amp;lt;br /&amp;gt;Files behind an infostore publication were accessible behind a static URL, which would theoretically allow them to be requested independently of the parent publication (e.g. images linked from an external website). While the entry URL to a publication would be mappable to a corresponding share URL, converting existing publications to shares would at least break such deep links.&lt;br /&gt;
&lt;br /&gt;
Because of the above points and the whole different concept, we do not migrate existing publications to shares. Instead, the default behavior will be:&lt;br /&gt;
&lt;br /&gt;
* No new OXMF publications or subscriptions can be created by default&lt;br /&gt;
* The web client does no longer give the option to publish or subscribe in the OXMF format&lt;br /&gt;
* Existing OXMF publications / subscriptions can't be updated&lt;br /&gt;
* Existing OXMF publications continue to work as is, including associated subscriptions&lt;br /&gt;
* Yet it's still possible to delete existing publications and subscriptions&lt;br /&gt;
* Therefore, the menu section &amp;amp;quot;Publications and Subscriptions&amp;amp;quot; will still be available (if there's at least one publication or subscription)&lt;br /&gt;
&lt;br /&gt;
Exceptions to these rules cover special internal subscriptions to 3rd party services like addressbooks from LinkedIn or Xing, as well as the auto-publish feature of mail attachments exceeding a specific size.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The possibility to create/update OXMF publications via HTTP-API may be configured via &amp;lt;code&amp;gt;com.openexchange.publish.createModifyEnabled&amp;lt;/code&amp;gt; in file &amp;lt;code&amp;gt;publications.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* The possibility to create/update OXMF subscriptions via HTTP-API may be configured via &amp;lt;code&amp;gt;com.openexchange.subscribe.microformats.createModifyEnabled&amp;lt;/code&amp;gt; in file &amp;lt;code&amp;gt;microformatSubscription.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limit file accesses for named/anonymous guests (since 7.8.2) ==&lt;br /&gt;
&lt;br /&gt;
As links to shares might be shared without knowing the audience we introduced a mechanism to prevent abuse.&lt;br /&gt;
&lt;br /&gt;
Therefor the possibility to define size and/or count limits for named/anonymous guests has been introduced. As internal users can be considered as reliable it is not possible to define limits for them. &lt;br /&gt;
&lt;br /&gt;
For named and anonymous guests there are two kinds of limits which apply to a defined time frame. The time frame acts as a sliding time window which means that based on the current request all earlier requests matching the time frame are cumulated and evaluated if one of the two limits is exceeded. If so, the request will be answered with an exception.&lt;br /&gt;
&lt;br /&gt;
The two limits mentioned above are:&lt;br /&gt;
&lt;br /&gt;
* size limits: how many content (in bytes) should the guest be allowed to download (within the defined time frame).&lt;br /&gt;
* count limits: how often should the guest be allowed to download a file or folder (within the defined time frame). &lt;br /&gt;
&lt;br /&gt;
Named and anonymos guests can have different limits. Limits are valid for downloads of files and folders. Preview of images is not considered within the limit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The anti-abuse mechanism will be available after updating the package open-xchange-core to release 7.8.2&lt;br /&gt;
* Additional parameters are located within the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* Per default the feature is disabled&lt;br /&gt;
* To enable the feature you have to set &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. If not enabled all additional checks will be skipped. If you would like to set limits via config cascade those will only be checked if the feature itself is enabled.&lt;br /&gt;
* To be more flexible the administrator is able to overwrite limits by using the config cascade. As guests do not have fixed user identifiers only the 'context' level scope is supported.&lt;br /&gt;
&lt;br /&gt;
After the feature is enabled you have the ability to configure fine-grained accesses via: &lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.timeFrame.guests&amp;lt;/code&amp;gt;: sliding time frame (in milliseconds) the limits are valid for named guests. Setting to 0 will disable the check for named guests (if not overwritten via config cascade).&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.timeFrame.links&amp;lt;/code&amp;gt;: sliding time frame (in milliseconds) the limits are valid for anonymous guests. Setting to 0 will disable the check for anonymous guests (if not overwritten via config cascade).&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.size.guests&amp;lt;/code&amp;gt;: the limit in bytes for named guests (valid for aboves time frame). Setting to 0 will disable the size check for named guests (if not overwritten via config cascade).&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.size.links&amp;lt;/code&amp;gt;: the limit in bytes for anonymous guests (valid for aboves time frame). Setting to 0 will disable the size check for anonymous guests (if not overwritten via config cascade).&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.count.guests&amp;lt;/code&amp;gt;: the limit for a number of downloads (valid for aboves time frame) for named guests. Setting to 0 will disable the count check for named guests (if not overwritten via config cascade).&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.count.links&amp;lt;/code&amp;gt;: the limit for a number of downloads (valid for aboves time frame) for anonymous guests. Setting to 0 will disable the count check for anonymous guests (if not overwritten via config cascade).&lt;br /&gt;
&lt;br /&gt;
=== Example configurations === &lt;br /&gt;
&lt;br /&gt;
A mixed configuration is possible. Have a look at the following examples assuming that &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.enabled&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following configuration only checks the count limit for anonymous guests. Named guests and the limit for download sizes will not be checked&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.timeFrame.guests:0&amp;lt;/code&amp;gt; (# disabled)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.timeFrame.links:3600000&amp;lt;/code&amp;gt; (# 60 minutes)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.size.guests:0&amp;lt;/code&amp;gt; (# not considered as disabled)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.size.links:0&amp;lt;/code&amp;gt; (# size for 60 minutes not checked)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.count.guests:0&amp;lt;/code&amp;gt; (# not considered as disabled)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.count.links:100&amp;lt;/code&amp;gt; (# 100 downloads within 60 minutes)&lt;br /&gt;
&lt;br /&gt;
The following configuration will check the count limit for named guests and the size limit for anonymous guests (both within the last 60 minutes).&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.timeFrame.guests:3600000&amp;lt;/code&amp;gt; (# 60 minutes)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.timeFrame.links:3600000&amp;lt;/code&amp;gt; (# 60 minutes)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.size.guests:0&amp;lt;/code&amp;gt; (# disabled)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.size.links:1073741824&amp;lt;/code&amp;gt; (# 1 GB)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.count.guests:1000&amp;lt;/code&amp;gt; (# 1000 downloads within 60 minutes)&lt;br /&gt;
* &amp;lt;code&amp;gt;com.openexchange.share.servlet.limit.count.links:0&amp;lt;/code&amp;gt; (# disabled)&lt;br /&gt;
&lt;br /&gt;
It is possible to reload an adapted configuration by using reloadconfiguration command line tool.&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;br /&gt;
[[Category: Administrator]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=CalDAVClients&amp;diff=22460</id>
		<title>CalDAVClients</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=CalDAVClients&amp;diff=22460"/>
		<updated>2016-10-20T06:48:40Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Open-Xchange Calendar synchronization with CalDAV =&lt;br /&gt;
&lt;br /&gt;
This site describes how the Open-Xchange server can be accessed via its CalDAV interface after the server has been configured as described in [[Caldav_carddav_Bundles]]. Depending on the used client software, different steps are necessary. Other clients may be configured similarly, but are not officially supported.&lt;br /&gt;
&lt;br /&gt;
== Mac OS X Calendar ==&lt;br /&gt;
&lt;br /&gt;
For the Calendar application on Mac OS X 10.9 (Mavericks) and above, a CalDAV account can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:caldav-account4.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Choose &amp;quot;Calendar&amp;quot; -&amp;gt; &amp;quot;Add Account...&amp;quot; from the Calendar App main Menu&lt;br /&gt;
* In the &amp;quot;Choose Calendar Account Provider...&amp;quot; Menu choose &amp;quot;Other CalDAV-Account...&amp;quot;&lt;br /&gt;
* In the &amp;quot;Add a CalDAV Account&amp;quot; Menu choose &amp;quot;Account Type&amp;quot; &amp;quot;Manual&amp;quot;&lt;br /&gt;
* In the &amp;quot;User name&amp;quot; field enter your username&lt;br /&gt;
* In the &amp;quot;Password&amp;quot; field enter your password&lt;br /&gt;
* In the &amp;quot;Server address&amp;quot; field enter your server address '''with the prefix &amp;quot;dav.&amp;quot; (e.g. &amp;quot;dav.myserver.tld&amp;quot;)'''.&lt;br /&gt;
* Click &amp;quot;Sign In&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Debug Options ===&lt;br /&gt;
You can enable a Debug Menu inside the iCal application which gives you access to advanced debugging and logging options. Please notice that some of these options may increase the size of the log files of your system and/or could also log sensitive data like passwords if enabled. Keep also in mind that any setting changed here will remain active until the setting itself will be reverted or changed again which means that disabling the Debug Menu itself is not sufficient to reset any debug settings to their defaults. All settings are case sensitive.&lt;br /&gt;
&lt;br /&gt;
Open a terminal window (Applications &amp;gt; Utilities &amp;gt; Terminal) and issue the following command for&lt;br /&gt;
* enabling the Debug Menu in iCal:&lt;br /&gt;
 defaults write com.apple.iCal CDB 1&lt;br /&gt;
* disabling the Debug Menu in iCal:&lt;br /&gt;
 defaults write com.apple.iCal CDB 0&lt;br /&gt;
* enabling CalDAV HTTP activity logging:&lt;br /&gt;
 defaults write com.apple.iCal LogHTTPActivity -boolean TRUE&lt;br /&gt;
* disabling CalDAV HTTP activity logging:&lt;br /&gt;
 defaults write com.apple.iCal LogHTTPActivity -boolean FALSE&lt;br /&gt;
&lt;br /&gt;
Starting with Mac OS 10.12 (&amp;quot;Sierra&amp;quot;), the log can be retrieved by the log utility from the commandline, e.g. via &lt;br /&gt;
 log stream --level=all --process CalendarAgent&lt;br /&gt;
&lt;br /&gt;
In previous versions, the logs are available in the &amp;quot;console&amp;quot; application.&lt;br /&gt;
&lt;br /&gt;
'''Pay attention''': If you change these settings it might be needed to kill the CalendarAgent process with &amp;lt;code&amp;gt;killall CalendarAgent&amp;lt;/code&amp;gt; just restarting the MacOS calendar application might not be enough. So in case you won't see any additional log output in the syslog, or the additional log output doesn't vanish after switching off these setting, please try killing the CalendarAgent process.&lt;br /&gt;
&lt;br /&gt;
== iOS Calendar ==&lt;br /&gt;
&lt;br /&gt;
The iOS Calendar application on the iPhone, iPod or iPad can be configured as follows.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:ios_caldav_config.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Open &amp;quot;Settings&amp;quot;&lt;br /&gt;
* Select &amp;quot;Mail, Contacts, Calendars&amp;quot; -&amp;gt; &amp;quot;Add Account...&amp;quot; -&amp;gt; &amp;quot;Other&amp;quot; -&amp;gt; &amp;quot;Add CalDAV Account&amp;quot;&lt;br /&gt;
* Enter the server address, username as password as shown in the screenshot&lt;br /&gt;
* Click &amp;quot;Next&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Thunderbird/Lightning ==&lt;br /&gt;
''Available since Open-Xchange Server v6.20.7''&lt;br /&gt;
&lt;br /&gt;
The steps below describe how to setup the Mozilla Thunderbird client with the Lightning Add-on. &lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
Please ensure that the following preconditions are met before continuing:&lt;br /&gt;
* Latest versions of the Mozilla Thunderbird E-Mail client and the Lightning Add-on (check https://addons.mozilla.org/thunderbird/addon/lightning/ and http://www.mozilla.org/thunderbird/ for details)&lt;br /&gt;
* In the Mozilla Thunderbird client, an E-Mail account for the user's Open-Xchange mailbox needs to be setup before configuring the CalDAV access&lt;br /&gt;
&lt;br /&gt;
=== Discover the CalDAV URL of your Calendar Folders ===&lt;br /&gt;
In contrast to some other clients, Thunderbird/Lightning is not able to discover all the available calendar collections automatically. Instead, each calendar folder needs to be added seperately in the client. To do so, one needs to know the CalDAV URLs of the calendar folder that should be synchronized with the client. This URL is displayed in the properties-page in the Groupware web-interface.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:CalDAV_URL_Step1.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Open a webbrowser and login to the groupware web-interface&lt;br /&gt;
* From the folder tree, open the context menu of a calendar folder and select &amp;quot;Properties&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[image:CalDAV_URL_Step2.png|thumb]] ||&lt;br /&gt;
* The CalDAV URL is shown in the content area. Note down the URL or copy it to the clipboard.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Add a Calendar in Thunderbird/Lightning ===&lt;br /&gt;
As already mentioned, each Calendar folder that should be sychronized has to be added separately in the client. The following steps show how to add a Calendar in Thunderbird/Lightning. Before starting, ensure that the client is connected to the network and the server can be accessed.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:LightningSetup_Step1.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Select &amp;quot;Events and Tasks&amp;quot; -&amp;gt; &amp;quot;Calendar&amp;quot; from the menu bar to switch to the Calendar view&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step2.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* From the menu bar, select &amp;quot;File&amp;quot; -&amp;gt; &amp;quot;New&amp;quot; -&amp;gt; &amp;quot;Calendar...&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step3.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* In the popup window, select &amp;quot;On the network&amp;quot; and click &amp;quot;Next &amp;gt;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step4.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* As format, select &amp;quot;CalDAV&amp;quot;&lt;br /&gt;
* Enter the CalDAV path as reported by the folder's properties page (see above) as location&lt;br /&gt;
* For offline access, check the &amp;quot;Cache&amp;quot; checkbox &lt;br /&gt;
* Click &amp;quot;Next &amp;gt;&amp;quot; to continue&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step5.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Enter a name for the Calendar and assign a color if you like &lt;br /&gt;
* Select whether reminders should be shown or not (recommended setting: off, see below for details)&lt;br /&gt;
* Select the E-Mail account belonging to the Calendar user from the list &lt;br /&gt;
* Click &amp;quot;Next &amp;gt;&amp;quot; to create the Calendar &lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step6.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* When requested, enter your username and password for the server&lt;br /&gt;
* Afterwards, the Calendar setup is complete and the contents are synchronized&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Debug Options ===&lt;br /&gt;
In case of synchronization problems, the built-in error console of Mozilla Thunderbird may provide valuable information. The error console can be opened via &amp;quot;Tools&amp;quot; -&amp;gt; &amp;quot;Error Console&amp;quot;. To increase the loglevel of the Lightning Add-on, open the config editor by selecting &amp;quot;Tools&amp;quot; -&amp;gt; &amp;quot;Options...&amp;quot; -&amp;gt; &amp;quot;Advanced&amp;quot; -&amp;gt; &amp;quot;Config Editor...&amp;quot; and set the properties &amp;quot;calendar.debug.log&amp;quot; and &amp;quot;calendar.debug.log.verbose&amp;quot; to &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General Limitations ==&lt;br /&gt;
Please consider the following known limitations for the CalDAV interface:&lt;br /&gt;
&lt;br /&gt;
=== Reminders ===&lt;br /&gt;
* While the iCalendar standard allows to set appointment reminders past due an appointment's start-date, the OX server is not able to save such alarm times and discards them.&lt;br /&gt;
* Multiple reminders in an event are not supported by the OX server and are discarded.&lt;br /&gt;
* Only reminders of type &amp;quot;DISPLAY&amp;quot; are supported by the OX server, reminders of other iCal types are discarded.&lt;br /&gt;
* When dismissing reminders of recurring appointments in the Mozilla Lightning client, the reminder is removed from the whole recurring appointment object, since it's not possible to determine to which occurrence the dismiss action belongs to.&lt;br /&gt;
* On iOS devices, when a custom default alert time is configured via Settings -&amp;gt; Mail, Contacts, Calendars -&amp;gt; Default Alert Times, this setting may also affect appointments you don't participate in. This is a client-specific feature and can't be influenced by the server.&lt;br /&gt;
* Due to incompatible handling of reminders in the Mozilla Thunderbird / Lightning client, especially for reminders in recurring appointments, it's recommended to turn off reminders in synchronized calendar folders there (from the context menu of a calendar, select 'Properties' and uncheck 'Show Alarms').&lt;br /&gt;
&lt;br /&gt;
=== Attachments ===&lt;br /&gt;
&lt;br /&gt;
Since v7.8.1, the OX server has support for synchronizing appointment attachments via CalDAV. Attachments are included as so-called managed attachments in the iCal data, which are basically ATTACH properties whose value is a link to the attachment's binary data on the server. More details are available at https://datatracker.ietf.org/doc/draft-daboo-caldav-attachments/ .&lt;br /&gt;
&lt;br /&gt;
Depending on the used client, some specials apply:&lt;br /&gt;
&lt;br /&gt;
==== Mac OS Calendar ====&lt;br /&gt;
* For appointments with existing attachments, the client sometimes refuses to apply local updates and displays a &amp;quot;Are you sure you want to delete the attachment&amp;quot; warning&lt;br /&gt;
* Occasionally, the client crashes when working with appointments having attachments (due to an uncaught internal error)&lt;br /&gt;
* In recurring appointments, there is no separation between the series itself and possible exceptions, i.e. the client displays a combined view of attachments for both the series itself, as well as those files that are attached to an exception instance&lt;br /&gt;
* The same goes for all attachment-related operations in recurring events, i.e. attachments are added, updated and removed from the main series only, regardless of an exception being selected&lt;br /&gt;
* To offer at least basic support for attachments, the server tries to mimic a CalDAV server not being able to support storing managed attachments on a per-recurrence instance basis (i.e., they can only be added to all instances as a whole), which correlates to the &amp;quot;calendar-managed-attachments-no-recurrence&amp;quot; capability)&lt;br /&gt;
&lt;br /&gt;
====eM Client==== &lt;br /&gt;
* In recurring appointments, the client displays both the attachments of the main series, as well as those from the exception. However, not the other way around, i.e. attachments targeting the exception explicitly don't show up in the main series.&lt;br /&gt;
* Besides displaying both attachments from the series as well as those from exception occurrences, the client also indicates all those attachments again when editing an exception again. Therefore, such attachments that already exist in the main series are skipped implicitly when importing the updated appointment again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Unsupported Properties ===&lt;br /&gt;
* Generally, only those appointment and task properties that are also available on the Open-Xchange server are used for synchronization, i.e. all unsupported properties are ignored and not saved.&lt;br /&gt;
* The &amp;quot;URL&amp;quot; property for iCal resources is not supported by the OX server and is discarded.&lt;br /&gt;
* Importing or exporting file attachments (property &amp;quot;ATTACH&amp;quot;) is not supported via the CalDAV interface prior v7.8.1.&lt;br /&gt;
&lt;br /&gt;
=== Private Appointments ===&lt;br /&gt;
* Appointments classified as &amp;quot;private&amp;quot; are exported by the server with the &amp;quot;CLASS&amp;quot; property set to &amp;quot;PRIVATE&amp;quot;.&lt;br /&gt;
* iCal events with the &amp;quot;CLASS&amp;quot; property set to either &amp;quot;CONFIDENTIAL&amp;quot; or &amp;quot;PRIVATE&amp;quot; are treated in the same way by the server and are imported as &amp;quot;private&amp;quot; appointments.&lt;br /&gt;
* Since &amp;quot;private&amp;quot; appointments with participants are not supported by the server, saving such an appointment results in the participants being removed implicitly during import.&lt;br /&gt;
&lt;br /&gt;
=== Tasks ===&lt;br /&gt;
* Only simple tasks (no participants, no recurrence) are supported.&lt;br /&gt;
* Only tasks from personal folders (no shared or public folders) are supported.&lt;br /&gt;
* Only the properties &amp;quot;DTSTART&amp;quot;, &amp;quot;DUE&amp;quot;, &amp;quot;CATEGORIES&amp;quot;, &amp;quot;SUMMARY&amp;quot;, &amp;quot;PRIORITY&amp;quot;, &amp;quot;DESCRIPTION&amp;quot;, &amp;quot;VALARM&amp;quot;, &amp;quot;STATUS&amp;quot;, &amp;quot;PERCENT-COMPLETE&amp;quot; and &amp;quot;COMPLETED&amp;quot; are synchronized, other ones are discarded by the server.&lt;br /&gt;
&lt;br /&gt;
===Creating new Collections===&lt;br /&gt;
* Creating a new collection in the client results in a new folder being created at the server, with the default calendar or tasks folder as its parent. &lt;br /&gt;
* In the Mac OS clients, the name of a new folder may be need to set twice during creation, since the collection's location as chosen by the client changes once after sending it to the server. &lt;br /&gt;
* Note: Due to the lacking support of the MKCALENDAR HTTP request in Apache's mod_ajp module, creating new collections currently only works when using the [[Grizzly]] package on the OX server.&lt;br /&gt;
&lt;br /&gt;
===Permissions in Shared Folders===&lt;br /&gt;
* In a Calendar folder that is shared to the CalDAV user by another groupware user, the Mac OS iCal client does not allow editing appointments where the CalDAV user is not the organizer of the appointment, even if sufficient permissions were granted. This is a built-in restriction of the client, however, you are still able to edit or delete such appointments in the groupware web interface.&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=22435</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=22435"/>
		<updated>2016-10-10T10:20:36Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API], the basic conventions for exchanging messages described there are also valid for this case, especially the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (low level protocol)] and [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (login module)].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since API version 5) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter if suitable.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, if the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-file is smaller than a certain threshold (the contents may still be requested with an explicit download then).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Synchronize files for multiple folders ==&lt;br /&gt;
&lt;br /&gt;
Utilizing the [[HTTP_API#Module_.22multiple.22|multiple]] request, it is possible to execute multiple &amp;quot;syncfiles&amp;quot; requests in parallel. Especially during an initial synchronization and in combination with &amp;quot;inline&amp;quot; mode for .drive-meta files, this may reduce the number of necessary requests. Therefore, the parameters and file versions of each &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request are serializied into a JSON array of the &amp;lt;code&amp;gt;multiple&amp;lt;/code&amp;gt;-request body. In the same way, the response contains the resulting actions of each &amp;quot;syncfiles&amp;quot; result in an JSON array of the response.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of executing three &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; actions inside a single &amp;lt;code&amp;gt;mutliple&amp;lt;/code&amp;gt; request:&lt;br /&gt;
&lt;br /&gt;
 ==&amp;gt; PUT http://local.ox/ajax/multiple?session=0833ca06093a4bad826347a30bf7ace7&amp;amp;continue=true&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     }]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (92.2341 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;e9000b2444dfbc780f91df6586e24615&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1663,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;33&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 3,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723311033,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723311019,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 5,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723313260,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 8,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723316567,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723316551,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;4&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;edit&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1467622558800&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;c4ca4238a0b923820dcc509a6f75849b&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458723332449&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;46114c4a55ed74b836da0fd83809fb06&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 2531,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103432&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 20,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1460443249927,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1459842066104&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;7c1e3c12567f8279dff97faee04af9c2&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 4421093,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1460443249927&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;ba45c8f60456a672e003a875e469d0eb&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 845941,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785226&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 595284,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785374&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;9829c1949b6347cec22467e34b0814dd&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 438,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103434&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 22,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: []&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1465453273921&lt;br /&gt;
       }]&lt;br /&gt;
     }]&lt;br /&gt;
	 &lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (token login)] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Folder Data)]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Infoitem Data)]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get trash folder statistics ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets statistics about the trash folder contents. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=trashStats&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the recursively accumulated folder statistics as described in [[#FolderStats|Folder Statistics]] below. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FolderStats&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Folder Statistics&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| totalSize || Number || The total size of the contents in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| numFiles || Number || The total number of contained files.&lt;br /&gt;
|-&lt;br /&gt;
| numFolders || Number || The total number of contained folders.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=trashStats&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (64.2423 ms elapsed, 67 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 30904580,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 39,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 4&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Empty trash folder ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Empties the trash folder, i.e. permanently removes any contained files and folders. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=emptyTrash&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the updated folder statistics after the trash was emptied as described in [[#FolderStats|Folder Statistics]]. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=emptyTrash&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 0&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Autocomplete contacts ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Performs a &amp;quot;starts-with&amp;quot; search to find users, contacts and groups, e.g. to look up recipients when sharing a folder or item. &amp;lt;br /&amp;gt; &lt;br /&gt;
Prior triggering the request, clients should check the user input against the configured value of &amp;lt;code&amp;gt;minSearchChars&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; - The query to search for (no need to include additional wildcards).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding the found users, contacts and groups. Each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)], without the &amp;quot;bits&amp;quot; property set. For external contacts, the fields &amp;quot;entity&amp;quot; and &amp;quot;type&amp;quot; are also not set.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=autocomplete&amp;amp;query=tes&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test1@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test1&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test1&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 1&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 6&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test4@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=13&amp;amp;timestamp=1453973021020&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 4&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 13&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test@example.org&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;Test&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;Otto&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/contact/picture?folder=31&amp;amp;id=118493&amp;amp;timestamp=1465481052986&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test, Otto&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 3851,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;group&amp;quot;,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test Group&amp;quot;&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Move/Rename a Directory ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 6. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Explicitly performs a move or rename operation for a directory. This method is intended for the situation when no phsyical copy of the synchronized data is available on the client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=moveFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;newPath&amp;lt;/code&amp;gt; - The new target path to apply, relative to the root folder.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object in case of a successful move. The client should perform the move operation locally afterwards, then enter a normal synchronization cycle to acknowledge any changes.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://local.ox/ajax/drive?action=moveFolder&amp;amp;root=163114&amp;amp;apiVersion=6&amp;amp;path=%2ftest&amp;amp;checksum=57ff72d92073bac92f13791bf4e7baf4&amp;amp;newPath=%2ftest3&amp;amp;session=9eabd980fead41d4ac81d32f6c86da5b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (90.064 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Move/Rename a File ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 6. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Explicitly performs a move or rename operation for a file. This method is intended for the situation when no phsyical copy of the synchronized data is available on the client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=moveFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name to apply.&lt;br /&gt;
* &amp;lt;code&amp;gt;newPath&amp;lt;/code&amp;gt; - The new target path to apply, relative to the root folder.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object in case of a successful move. The client should perform the move operation locally afterwards, then enter a normal synchronization cycle to acknowledge any changes.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://local.ox/ajax/drive?action=moveFile&amp;amp;root=163162&amp;amp;apiVersion=6&amp;amp;path=%2f&amp;amp;name=wurst.txt&amp;amp;checksum=f04e78d909d69a8463afd9e4dd159dcc&amp;amp;newName=wurst2.txt&amp;amp;session=213306bec07644ae9b6cc6a16d2be022&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (43.6119 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Flags)]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:S3_File_Store&amp;diff=22397</id>
		<title>AppSuite:S3 File Store</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:S3_File_Store&amp;diff=22397"/>
		<updated>2016-09-12T06:41:05Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Besides ordinary local- or NFS-filesystem-based filestores, OX may also be used with a cloud storage solution offering an S3 interface. The required functionality is added with the package ''open-xchange-filestore-s3''. The filestore integration was tested against the regular Amazon Simple Storage Service (S3), however, other object storage implementation offering an S3-compatible API should work, too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installation &amp;amp; Configuration =&lt;br /&gt;
&lt;br /&gt;
This chapter shows which components need to be installed and where configuration is done.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin | pluginname=open-xchange-filestore-s3 | toplevel=products | sopath=appsuite/stable/backend | version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
S3 filestores can be configured in the configuration file ''filestore-s3.properties'' once they have been registered on the server with the ''registerfilestore'' command. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Register an S3 filestore ===&lt;br /&gt;
&lt;br /&gt;
Similarly to local- or NFS-filesystem-based filestores, S3 filestore need to be registered using the commandline tool ''registerfilestore'' before they can be used. The ''scheme''-part of the filestore URI must be set to ''s3'' in this case. Besides the common ''s3://'' prefix of such filestore URIs, the remaining authority component of the URI specifies an identifier of the filestore that will be used to refer to this filestore registration in the configuration file. It's recommended to use the bucket name here, for example:&lt;br /&gt;
&lt;br /&gt;
 root@ox01:/opt/open-xchange/sbin# ./registerfilestore -A oxadminmaster -P secret -t s3://ox-filestore-s3 -s 1048576000 -x 5000&lt;br /&gt;
 filestore 7433 registered&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configure the filestore ===&lt;br /&gt;
&lt;br /&gt;
Additional configuration for each registered filestore is done in the configuration file ''filestore-s3.properties''. To map configuration properties to specific filestore registrations, the filestore identifier corresponding to the defined authority part of the filestore URI is used in the property names. Please refer to the inline documentation or the examples below for details.&lt;br /&gt;
&lt;br /&gt;
Note: In most cases, you want to use the same configuration throughout the whole ox cluster, so you should make sure to use the same ''filestore-s3.properties'' configuration file on all nodes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Step-by-step guide to setup an AWS S3 storage =&lt;br /&gt;
&lt;br /&gt;
The following walktrhorugh outlines all steps necessary to complete the setup of a S3 filestore running on the regular Amazon Simple Storage Service (S3). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* Installed ''open-xchange-filestore-s3'' package&lt;br /&gt;
* A valid account for Amazon S3&lt;br /&gt;
* AWS access key, e.g. ''AKIAIOSFODNN7EXAMPLE''&lt;br /&gt;
* AWS secret key, e.g. ''wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a bucket ==&lt;br /&gt;
* Login to the S3 Management Console at https://console.aws.amazon.com/s3/&lt;br /&gt;
* Click the ''Create Bucket'' button&lt;br /&gt;
* Select a bucket name of your choice, e.g. ''ox-filestore-s3''&lt;br /&gt;
* Select the region according to your needs, e.g. ''EU (Ireland)''&lt;br /&gt;
* Click ''Create''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Register the filestore ==&lt;br /&gt;
* Open a terminal on a running backend server of your OX cluster&lt;br /&gt;
* Navigate to the directory where the commandline utilities are installed, usually at ''/opt/open-xchange/sbin''&lt;br /&gt;
* Run the ''registerfilestore'' tool using a storepath URL starting with the ''s3'' scheme (use ''s3://'' as prefix literally) followed by the filestore ID (the bucket name seems most appropriate here, however, you can still use a different name), e.g.:&lt;br /&gt;
 ./registerfilestore -A oxadminmaster -P secret -t s3://ox-filestore-s3 -s 1048576000 -x 5000''&lt;br /&gt;
(execute &amp;quot;./registerfilestore -h&amp;quot; for more information regarding possible commandline arguments)&lt;br /&gt;
* The internal ID of the new filestore is printed out &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configure the filestore ==&lt;br /&gt;
* Open the configuration file ''filestore-s3.properties'' in your favourite editor&lt;br /&gt;
* Insert a new set of properties using the filestore ID assigned during registration of the filestore in the previous step, e.g. ''ox-filestore-s3'':&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.endpoint=&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.bucketName=&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.region=&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.pathStyleAccess=&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.accessKey=&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.secretKey=&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.encryption=&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.signerOverride=&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.chunkSize=&lt;br /&gt;
* Specify the endpoint to use depending on the chosen region (see http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region for a list of endpoints), e.g.:&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.endpoint=https://s3-eu-west-1.amazonaws.com&lt;br /&gt;
* Set the bucket name for the filestore, e.g.:&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.bucketName=ox-filestore-s3&lt;br /&gt;
* Define the location constraint according to the chosen region - valid values are listed in the comments of the properties file - e.g.:&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.region=eu-west-1&lt;br /&gt;
* Configure path style / virtual host access (recommended to set to ''false'' for Amazon S3, must be ''false'' when using the default endpoint ''s3.amazonaws.com'' and a different region than US), see http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html for details):&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.pathStyleAccess=false&lt;br /&gt;
* Specify your API access and secret keys, e.g.:&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.accessKey=AKIAIOSFODNN7EXAMPLE&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.secretKey=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY&lt;br /&gt;
* Configure encryption as needed (''none'' in this example):&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.encryption=none&lt;br /&gt;
* Specify the signing algorithm if applicable. Please mind that this setting needs to be adjusted to &amp;quot;AWSS3V4SignerType&amp;quot; when targeting the newer &amp;quot;v4-only&amp;quot; regions like Frankfurt or Beijing.&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.encryption=S3SignerType&lt;br /&gt;
* Optionally override the default minimum chunk size to use when doing multipart uploads.&lt;br /&gt;
 com.openexchange.filestore.s3.ox-filestore-s3.chunkSize=5MB&lt;br /&gt;
&lt;br /&gt;
== Create contexts using the filestore ==&lt;br /&gt;
* New contexts that should use the configured filestore can be created by suppliying the ID of the registered filestore in the ''createcontext'' commandline tool. Use the internal ID returned by the previously used ''registerfilestore'' command executed above, e.g., assuming the ID returned from the ''registerfilestore'' command was ''6'':&lt;br /&gt;
 ./createcontext -A oxadminmaster -P secret -u oxadmin -d &amp;quot;Context Admin&amp;quot; -g Admin -s User -p secret -e oxadmin@example.com -q 1000 -L example.com --access-combination-name=all -F 6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Check the configuration ==&lt;br /&gt;
* Login to the App Suite webinterface with a user from a context using the S3 filestore&lt;br /&gt;
* Upload a new file in the ''Drive'' module and download it again to verify basic functionality&lt;br /&gt;
* Check the S3 management console to verify the creation of the new file; here, the file should show up under a virtual prefix based on the parent context&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=22202</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=22202"/>
		<updated>2016-07-15T13:43:06Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API], the basic conventions for exchanging messages described there are also valid for this case, especially the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (low level protocol)] and [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (login module)].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (error handling)]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since API version 5) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter if suitable.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, if the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-file is smaller than a certain threshold (the contents may still be requested with an explicit download then).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Synchronize files for multiple folders ==&lt;br /&gt;
&lt;br /&gt;
Utilizing the [[HTTP_API#Module_.22multiple.22|multiple]] request, it is possible to execute multiple &amp;quot;syncfiles&amp;quot; requests in parallel. Especially during an initial synchronization and in combination with &amp;quot;inline&amp;quot; mode for .drive-meta files, this may reduce the number of necessary requests. Therefore, the parameters and file versions of each &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request are serializied into a JSON array of the &amp;lt;code&amp;gt;multiple&amp;lt;/code&amp;gt;-request body. In the same way, the response contains the resulting actions of each &amp;quot;syncfiles&amp;quot; result in an JSON array of the response.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of executing three &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; actions inside a single &amp;lt;code&amp;gt;mutliple&amp;lt;/code&amp;gt; request:&lt;br /&gt;
&lt;br /&gt;
 ==&amp;gt; PUT http://local.ox/ajax/multiple?session=0833ca06093a4bad826347a30bf7ace7&amp;amp;continue=true&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;drive&amp;quot;,&lt;br /&gt;
       &amp;quot;action&amp;quot;: &amp;quot;syncfiles&amp;quot;,&lt;br /&gt;
       &amp;quot;root&amp;quot;: 33,&lt;br /&gt;
       &amp;quot;apiVersion&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
       &amp;quot;driveMeta&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
         &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
       }&lt;br /&gt;
     }]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (92.2341 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [{&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;e9000b2444dfbc780f91df6586e24615&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1663,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;33&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=33&amp;amp;id=33/488915&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723308686,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 3,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723311033,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723311019,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 5,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723313260,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723332449,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;file_size&amp;quot;: 8,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1458723316567,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1458723316551,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;4&amp;quot;,&lt;br /&gt;
               &amp;quot;version_comment&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;edit&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1467622558800&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;c4ca4238a0b923820dcc509a6f75849b&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;versions.txt&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458723308686,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458723332449&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;46114c4a55ed74b836da0fd83809fb06&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 2531,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103432&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 20,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 192,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: [{&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785226,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488906&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1458717785374,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/488907&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;,&lt;br /&gt;
             &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
             &amp;quot;modified&amp;quot;: 1460443249927,&lt;br /&gt;
             &amp;quot;created_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;modified_by&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;content_type&amp;quot;: &amp;quot;image/jpeg&amp;quot;,&lt;br /&gt;
             &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;folder=103432&amp;amp;id=103432/494179&amp;amp;version=1&amp;amp;context=1&amp;amp;user=4&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=200&amp;amp;height=150&amp;amp;shrinkOnly=true&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;,&lt;br /&gt;
             &amp;quot;version_history&amp;quot;]&lt;br /&gt;
           }]&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1459842066104&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;7c1e3c12567f8279dff97faee04af9c2&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;2110.JPG&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 4421093,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1460283874321,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1460443249927&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;ba45c8f60456a672e003a875e469d0eb&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Desert.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 845941,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785226,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785226&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Hydrangeas.jpg&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 595284,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1458717785374,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1458717785374&lt;br /&gt;
       }]&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
         &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;9829c1949b6347cec22467e34b0814dd&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;totalLength&amp;quot;: 438,&lt;br /&gt;
         &amp;quot;data&amp;quot;: {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;103434&amp;quot;,&lt;br /&gt;
           &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
           &amp;quot;type&amp;quot;: 22,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;group&amp;quot;: false&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Jens Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens@local.ox&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=4&amp;amp;timestamp=1453992059223&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;files&amp;quot;: []&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Music&amp;quot;,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1465453273921&lt;br /&gt;
       }]&lt;br /&gt;
     }]&lt;br /&gt;
	 &lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (token login)] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (share link)]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Folder Data)]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Detailed Infoitem Data)]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get trash folder statistics ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets statistics about the trash folder contents. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=trashStats&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the recursively accumulated folder statistics as described in [[#FolderStats|Folder Statistics]] below. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FolderStats&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Folder Statistics&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| totalSize || Number || The total size of the contents in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| numFiles || Number || The total number of contained files.&lt;br /&gt;
|-&lt;br /&gt;
| numFolders || Number || The total number of contained folders.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=trashStats&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (64.2423 ms elapsed, 67 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 30904580,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 39,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 4&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Empty trash folder ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Empties the trash folder, i.e. permanently removes any contained files and folders. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=emptyTrash&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the updated folder statistics after the trash was emptied as described in [[#FolderStats|Folder Statistics]]. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=emptyTrash&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 0&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Autocomplete contacts ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Performs a &amp;quot;starts-with&amp;quot; search to find users, contacts and groups, e.g. to look up recipients when sharing a folder or item. &amp;lt;br /&amp;gt; &lt;br /&gt;
Prior triggering the request, clients should check the user input against the configured value of &amp;lt;code&amp;gt;minSearchChars&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; - The query to search for (no need to include additional wildcards).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding the found users, contacts and groups. Each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)], without the &amp;quot;bits&amp;quot; property set. For external contacts, the fields &amp;quot;entity&amp;quot; and &amp;quot;type&amp;quot; are also not set.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=autocomplete&amp;amp;query=tes&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test1@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test1&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test1&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 1&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 6&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test4@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=13&amp;amp;timestamp=1453973021020&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 4&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 13&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test@example.org&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;Test&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;Otto&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/contact/picture?folder=31&amp;amp;id=118493&amp;amp;timestamp=1465481052986&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test, Otto&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 3851,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;group&amp;quot;,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test Group&amp;quot;&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Flags)]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Permission Object)].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Extended Object Permission Object)]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21999</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21999"/>
		<updated>2016-06-09T14:11:45Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since API version 5) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter if suitable.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, if the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-file is smaller than a certain threshold (the contents may still be requested with an explicit download then).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get trash folder statistics ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets statistics about the trash folder contents. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=trashStats&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the recursively accumulated folder statistics as described in [[#FolderStats|Folder Statistics]] below. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FolderStats&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Folder Statistics&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| totalSize || Number || The total size of the contents in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| numFiles || Number || The total number of contained files.&lt;br /&gt;
|-&lt;br /&gt;
| numFolders || Number || The total number of contained folders.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=trashStats&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (64.2423 ms elapsed, 67 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 30904580,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 39,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 4&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Empty trash folder ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Empties the trash folder, i.e. permanently removes any contained files and folders. &amp;lt;br /&amp;gt; &lt;br /&gt;
If a trash folder is available or not can be checked via &amp;lt;code&amp;gt;hasTrashFolder&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=emptyTrash&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the updated folder statistics after the trash was emptied as described in [[#FolderStats|Folder Statistics]]. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=emptyTrash&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 0&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Autocomplete contacts ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Performs a &amp;quot;starts-with&amp;quot; search to find users, contacts and groups, e.g. to look up recipients when sharing a folder or item. &amp;lt;br /&amp;gt; &lt;br /&gt;
Prior triggering the request, clients should check the user input against the configured value of &amp;lt;code&amp;gt;minSearchChars&amp;lt;/code&amp;gt; received in the [[#Get Settings | Settings]] request.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; - The query to search for (no need to include additional wildcards).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding the found users, contacts and groups. Each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]], without the &amp;quot;bits&amp;quot; property set. For external contacts, the fields &amp;quot;entity&amp;quot; and &amp;quot;type&amp;quot; are also not set.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=autocomplete&amp;amp;query=tes&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test1@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test1&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test1&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 1&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 6&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test4@local.ox&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;test4&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=13&amp;amp;timestamp=1453973021020&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test User 4&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 13&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;contact&amp;quot;: {&lt;br /&gt;
           &amp;quot;email1&amp;quot;: &amp;quot;test@example.org&amp;quot;,&lt;br /&gt;
           &amp;quot;last_name&amp;quot;: &amp;quot;Test&amp;quot;,&lt;br /&gt;
           &amp;quot;first_name&amp;quot;: &amp;quot;Otto&amp;quot;,&lt;br /&gt;
           &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/contact/picture?folder=31&amp;amp;id=118493&amp;amp;timestamp=1465481052986&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test, Otto&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 3851,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;group&amp;quot;,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Test Group&amp;quot;&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21994</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21994"/>
		<updated>2016-06-09T07:40:09Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since API version 5) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter if suitable.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, if the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-file is smaller than a certain threshold (the contents may still be requested with an explicit download then).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get trash folder statistics ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets statistics about the trash folder contents.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=trashStats&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the recursively accumulated folder statistics as described in [[#FolderStats|Folder Statistics]] below. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FolderStats&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Folder Statistics&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| totalSize || Number || The total size of the contents in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| numFiles || Number || The total number of contained files.&lt;br /&gt;
|-&lt;br /&gt;
| numFolders || Number || The total number of contained folders.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=trashStats&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (64.2423 ms elapsed, 67 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 30904580,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 39,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 4&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Empty trash folder ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 5. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Empties the trash folder, i.e. permanently removes any contained files and folders.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=emptyTrash&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the updated folder statistics after the trash was emptied as described in [[#FolderStats|Folder Statistics]]. If no trash folder is available, an empty response is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=emptyTrash&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (184.0234 ms elapsed, 52 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;totalSize&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFiles&amp;quot;: 0,&lt;br /&gt;
         &amp;quot;numFolders&amp;quot;: 0&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21951</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21951"/>
		<updated>2016-06-01T10:01:33Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: /* edit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since API version 5) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter if suitable.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, if the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-file is smaller than a certain threshold (the contents may still be requested with an explicit download then).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21945</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21945"/>
		<updated>2016-05-30T13:16:43Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: /* Synchronize files in a folder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since API version 5) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter if suitable.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, if the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-file is smaller than a certain threshold (the contents may still be requested with an explicit download then).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21944</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21944"/>
		<updated>2016-05-30T12:13:53Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| root || String || The corresponding root folder identifier (optional, available since API version 5).&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since v7.8.2) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or an internal request timeout elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, it's also possible to poll for changes in more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to listen for changes in.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. The relevant root folder identifier is available in the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; parameter of the action. If there are no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=listen&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;root&amp;quot; : &amp;quot;129137&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, a subscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to subscribe to.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID, the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Alterantively, since API version 5, an unsubscription can also be performed for more than one root folder, e.g. when also synchronizing a shared or public subfolder tree. Therefore, the &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; method can be used, with the root folder identifiers being passed in the request body.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Request Body:&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; holding a JSON array of those root folder identifiers to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;root&amp;quot;: [ &amp;quot;129136&amp;quot;, &amp;quot;129137&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21807</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21807"/>
		<updated>2016-04-07T12:20:06Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since v7.8.2) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 3:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=123975&amp;amp;path=/&amp;amp;apiVersion=4&amp;amp;driveMeta=inline&amp;amp;session=0833ca06093a4bad826347a30bf7ace7&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot;: [],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot;: []&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (27.5238 ms elapsed, 2058 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;actions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;36301942a30c3c09bc59f6e9b0c63fba&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;.drive-meta&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 1511,&lt;br /&gt;
           &amp;quot;data&amp;quot;: {&lt;br /&gt;
             &amp;quot;id&amp;quot;: &amp;quot;123975&amp;quot;,&lt;br /&gt;
             &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;group&amp;quot;: false&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
               &amp;quot;entity&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
               &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
               &amp;quot;display_name&amp;quot;: &amp;quot;Test User 2&amp;quot;,&lt;br /&gt;
               &amp;quot;contact&amp;quot;: {&lt;br /&gt;
                 &amp;quot;email1&amp;quot;: &amp;quot;test2@local.ox&amp;quot;,&lt;br /&gt;
                 &amp;quot;last_name&amp;quot;: &amp;quot;test2&amp;quot;,&lt;br /&gt;
                 &amp;quot;first_name&amp;quot;: &amp;quot;test2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
             }],&lt;br /&gt;
             &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
             &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
             &amp;quot;files&amp;quot;: [{&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191867,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493515&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
               &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;,&lt;br /&gt;
               &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;modified&amp;quot;: 1460030191931,&lt;br /&gt;
               &amp;quot;created_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;modified_by&amp;quot;: 7,&lt;br /&gt;
               &amp;quot;content_type&amp;quot;: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
               &amp;quot;preview&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=1600&amp;amp;height=1600&amp;quot;,&lt;br /&gt;
               &amp;quot;thumbnail&amp;quot;: &amp;quot;http://local.ox/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=123975&amp;amp;id=123975/493516&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
               &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
               &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
               &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
               &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
               &amp;quot;edit&amp;quot;,&lt;br /&gt;
               &amp;quot;permissions&amp;quot;,&lt;br /&gt;
               &amp;quot;version_history&amp;quot;]&lt;br /&gt;
             }]&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191779&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;e8d1be53d24895ae5cfc2808bec152bc&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test1.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191867,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191867&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;action&amp;quot;: &amp;quot;download&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot;: {&lt;br /&gt;
             &amp;quot;checksum&amp;quot;: &amp;quot;767c4efab82482dcfafdcdbc034800d4&amp;quot;,&lt;br /&gt;
             &amp;quot;name&amp;quot;: &amp;quot;test2.txt&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;totalLength&amp;quot;: 36,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1460030191931,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1460030191931&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21795</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21795"/>
		<updated>2016-04-06T07:19:45Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
* &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; (optional, available since v7.8.2) - Controls the &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; synchronization mode: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to forcibly enable or disable metadata synchronization for the request, or &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt; to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt;-data inside a corresponding &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; action as &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;-parameter.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; If &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; was set to &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; actions for &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; will carry the metadata in an additional JSON object in the corresponding action's parameters at &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21794</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21794"/>
		<updated>2016-04-06T07:03:11Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]]. If available, the requested metadata of files is included in the corresponsing &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#FileMetadata|File Metadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode&amp;diff=21718</id>
		<title>AppSuite:Sharing and Guest Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode&amp;diff=21718"/>
		<updated>2016-03-24T07:45:56Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: /* Required Permissions and Capabilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Sharing and Guest Mode&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Starting with v7.8.0, the Open-Xchange server comes with a whole new concept to share contents with external people, allowing guest users to interact with the shared data in the same way as regular groupware users do. This article describes the underlying technical implications and outlines the different use cases.&lt;br /&gt;
&lt;br /&gt;
The main idea behind the new sharing concept is that guest users, i.e. external users without a regular account on the server, should be able to access the shared contents using the existing interfaces, especially the App Suite web interface. On the one hand, this includes consuming the shared data using the App Suite's advanced media viewing capabilities. On the other hand, this enables guests to edit existing as well as to create or upload new content in the groupware. Even real-time collaboration between internal users and guests in OX Documents is possible.&lt;br /&gt;
&lt;br /&gt;
The following chapters cover different topics regarding sharing and guest users and try to describe some technical background and impact where hosters, administrators or integrators might be interested in.&lt;br /&gt;
&lt;br /&gt;
== Creating Shares ==&lt;br /&gt;
&lt;br /&gt;
Basically, creating a share means adding an additional permission entity to the shared folder or item. Previously, this was only possible for &amp;amp;quot;internal&amp;amp;quot; entities, i.e. regular users or user groups. Now, the underlying permission system has been extended to support external entities, which can be either invited guest users, or special &amp;amp;quot;anonymous&amp;amp;quot; guest users who access a shared folder or item via a secret link. Anonymous and invited guest users are explained in more detail below.&lt;br /&gt;
&lt;br /&gt;
Sharing is available for the groupware modules Calendar, Contacts, Tasks and Drive (a.k.a. Infostore/Files). While the latter one also allows &amp;quot;writable&amp;quot; access for invited guest users, folders from the Calendar, Contacts and Tasks module may only be published in &amp;quot;read-only&amp;quot; mode to external guests.&lt;br /&gt;
&lt;br /&gt;
=== Invite Guests ===&lt;br /&gt;
&lt;br /&gt;
To share something to a guest user, it's possible to just add the e-mail address of the invitee as new permission entity for files and folders. The middleware then takes care to provision a new or reuse an existing account for the guest user, and equips him with the required permissions for accessing the contents. So, from a client's point of view, sharing something to a guest user is mostly the same process as sharing something to an internal user or group.&lt;br /&gt;
&lt;br /&gt;
=== Share Links ===&lt;br /&gt;
&lt;br /&gt;
Besides explicitly inviting a guest user to a share, it's also possible to just get a secret link for a folder or item. This will result in an additional &amp;amp;quot;anonymous&amp;amp;quot; guest entity in the permissions of the shared object, and will grant any user with the corresponding share link access the shared contents. To simplify the creation of share links, the clients will offer an additional &amp;amp;quot;wizard&amp;amp;quot; to quickly get a share link for a folder or item. Unlike invited guests which behave much like internal users, anonymous guest entities are strictly bound to the underlying folder or item, i.e. there is at most one anonymous permission entity per file or folder, as well as an anonymous permission entity can only be used for only once.&lt;br /&gt;
&lt;br /&gt;
=== Required Permissions and Capabilities ===&lt;br /&gt;
&lt;br /&gt;
Whether a user is allowed to create share links, invite external guests, or internal groups or users, depends on the following module access permissions and capabilities. Please note that share links no longer require &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt; since Open-Xchange v7.8.1; this restriction was removed in order to allow simple publications also for non-groupware accounts, e.g. as defined by the &amp;lt;code&amp;gt;pim&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;pim_infostore&amp;lt;/code&amp;gt; module access combinations.&lt;br /&gt;
&lt;br /&gt;
==== v7.8.0 ====&lt;br /&gt;
* Create, update &amp;amp; remove share links: &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove internal users and group permissions: &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove external guest permissions: &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v7.8.1 ====&lt;br /&gt;
* Create, update &amp;amp; remove share links: &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove internal users and group permissions in modules Calendar, Contacts, Tasks: &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt; for personal / &amp;lt;code&amp;gt;edit_public_folders&amp;lt;/code&amp;gt; for public folders&lt;br /&gt;
* Add, update or remove internal users and group permissions in module Drive: none&lt;br /&gt;
* Add, update or remove external guest permissions in modules Calendar, Contacts, Tasks: &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt; for personal / &amp;lt;code&amp;gt;edit_public_folders&amp;lt;/code&amp;gt; for public folders&lt;br /&gt;
* Add, update or remove external guest permissions in module Drive: &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Existing shares for a guest user or context may be listed using the commandline utility &amp;lt;code&amp;gt;listshares&amp;lt;/code&amp;gt;&lt;br /&gt;
* The ability to create share links may be controlled via &amp;lt;code&amp;gt;com.openexchange.capability.share_links&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;permissions.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The ability to invite guest users may be controlled via &amp;lt;code&amp;gt;com.openexchange.capability.invite_guests&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;permissions.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The number of allowed share links per user may be specified via &amp;lt;code&amp;gt;com.openexchange.quota.share_links&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The number of allowed guest invitations per user may be specified via &amp;lt;code&amp;gt;com.openexchange.quota.invite_guests&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
&lt;br /&gt;
== Removing Shares ==&lt;br /&gt;
&lt;br /&gt;
The lifetime of shares is implicitly bound to the lifetime of the associated permission of the guest user entity. So, once a permission entity pointing to a (named or anonymous) guest user account is removed from the parent folder or item, this also leads to the removal of the associated share itself. Afterwards, the contents are no longer accessible for the guest user. For shares that were created with a specific expiry date, it is ensured that they can no longer be accessed via their share link after expiring. Additionally, expired shares are cleaned up periodically within a background task.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Shares may be revoked manually using the commandline utility &amp;lt;code&amp;gt;removeshares&amp;lt;/code&amp;gt;&lt;br /&gt;
* The interval of the periodic cleanup task can be controlled via &amp;lt;code&amp;gt;com.openexchange.share.cleanup.periodicCleanerInterval&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Share Links &amp;amp;amp; Tokens ==&lt;br /&gt;
&lt;br /&gt;
Shares are accessed with a hyperlink that contains the so-called share &amp;amp;quot;token&amp;amp;quot;. This 24-byte token uniquely identifies the associated guest account on the system, and carries enough randomness that it can't be guessed. Explicitly invited guest users receive this hyperlink in the invitation mail to a share, while in case of an &amp;amp;quot;anonymous&amp;amp;quot; share where just the link itself was generated, it's up to the sharing user to distribute the link on his own. Besides the token, a share link may contain an additional path that points to the concrete folder and item, which just aids to jump to the shared item in the web interface directly. The following shows an example of a share link:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://share.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/1/2/ODAxMDY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a guest user has been invited to more than one share in a context (based on his e-mail address), his individual share token remains equal, so that he will have access to all shared contents in the web interface after following any of the share links he received. However, the additional &amp;amp;quot;path&amp;amp;quot; still points to the concrete item. When inviting more than one guest user to the same share, each recipient will get his own individual share link.&lt;br /&gt;
&lt;br /&gt;
Once the share URL is requested from the server, the associated guest account is looked up and, depending of the guest type, the request is redirected to a specific login screen or directly into the App Suite web interface. More details regarding the different login modes are described at [[#Guest_Login_&amp;amp;_Session_Handling|Guest Login &amp;amp;amp; Session Handling]].&lt;br /&gt;
&lt;br /&gt;
After a share has been revoked (either explicitly, by removing the permission, or if the share is expired), share links can't be accessed any longer, and, after the last share for the guest user was removed, the guest account is removed from the system automatically.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The share token is stored as user attribute &amp;lt;code&amp;gt;com.openexchange.shareBaseToken&amp;lt;/code&amp;gt; in the corresponding guest user account&lt;br /&gt;
* The target database schema for a share and the associated guest account is extracted from the context identifier encoded in the share token&lt;br /&gt;
&lt;br /&gt;
== Guest Users ==&lt;br /&gt;
&lt;br /&gt;
As outlined above, guest users are created on demand once something is being shared. We basically distinguish between two types of guest users: Those that were invited explicitly by the sharing user, or &amp;amp;quot;anonymous&amp;amp;quot; guest users that are able to access by visiting the share link. Access for the latter one may optionally be secured with a fixed PIN code.&lt;br /&gt;
&lt;br /&gt;
For both kinds of guest users, a corresponding user account is provisioned dynamically on the system once a new share is created. Such a guest account is handled much similar as an account for a regular user, with the following main exceptions:&lt;br /&gt;
&lt;br /&gt;
* No access to the &amp;amp;quot;Mail&amp;amp;quot; module&lt;br /&gt;
* No personal folders&lt;br /&gt;
* No access to the &amp;amp;quot;Portal&amp;amp;quot;&lt;br /&gt;
* No access to the global address book&lt;br /&gt;
* Module access is restricted to only include modules from the actual shares&lt;br /&gt;
&lt;br /&gt;
All those restrictions are configured and enforced using the built-in mechanisms of the Open-Xchange Server, i.e. by a reduced set of capabilities (i.e. module permissions), or by selectively set permission bits in the folder tree for the virtual guest group. This ensures that guest users are only able to access things they explicitly have been invited to, as well as a transparent handling of guest accounts within all subsystems.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Guest users are stored much similar as regular users in the database (tables &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prg_contacts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_attribute&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_configuration&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Additionally, the identifier of the user who (initially) created the guest account is stored in &amp;lt;code&amp;gt;user.guestCreatedBy&amp;lt;/code&amp;gt;, i.e. if this column is not &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, this entry refers to a guest user&lt;br /&gt;
* All service calls and APIs that list or search users have been adjusted to be &amp;amp;quot;guest-aware&amp;amp;quot;, i.e. by default, guests users are not included in the output, yet may be included explicitly with additional parameters (namely &amp;lt;code&amp;gt;includeGuests&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;excludeUsers&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Service calls and APIs that request data explicitly based on an entity's identifier are also working with guest users, i.e. if a specific idnetifier points to a guest, then the referenced guest data is returned&lt;br /&gt;
&lt;br /&gt;
=== Capabilities ===&lt;br /&gt;
&lt;br /&gt;
Guest users always have the &amp;lt;code&amp;gt;guest&amp;lt;/code&amp;gt; capability set. Besides they are generally configured with a limited permission set, that allows them just to work with their shared items. This permission set includes:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Permission&lt;br /&gt;
!Capability&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;deniedportal&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|No &amp;lt;code&amp;gt;portal&amp;lt;/code&amp;gt; capability&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;editpublicfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;edit_public_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;editpassword&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;edit_password&amp;lt;/code&amp;gt;&lt;br /&gt;
|Only for invited guests, not links&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Additionally, for every module the guest is having shared items in, the according module permission is granted, e.g. a shared drive folder results in permission &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt; and the according capability. Guest users are never allowed to share folders or items on their own, i.e. the capabilities &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt; can never be set.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
This limited capability set can be extended by configuration. Currently three modes are supported:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Mode&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|deny_all&lt;br /&gt;
|No further capabilities are applied to guest users, except ones that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|static&lt;br /&gt;
|A static list of capabilities is applied to guest users via the &amp;lt;code&amp;gt;com.openexchange.share.staticGuestCapabilities&amp;lt;/code&amp;gt; property. Additionally capabilities that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt; are applied.&lt;br /&gt;
|-&lt;br /&gt;
|inherit&lt;br /&gt;
|All capabilities of the user who &amp;amp;quot;created&amp;amp;quot; the guest, i.e. created the link or initially invited somebody, are applied to the guest user. Additionally capabilities that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt; are applied.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The mode can be configured via the &amp;lt;code&amp;gt;com.openexchange.share.guestCapabilityMode&amp;lt;/code&amp;gt; property in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;. This property is config-cascade capable, so it can for example be overridden for certain sets of contexts. The same applies to the &amp;lt;code&amp;gt;com.openexchange.share.staticGuestCapabilities&amp;lt;/code&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
Due to this configuration mechanism it is possible to increase the user experience for guests and even allow some real collaboration. As an example one could apply the following configuration to allow guests to see preview images of files and edit shared documents with OX Text and OX Spreadsheet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;com.openexchange.share.guestCapabilityMode = static&lt;br /&gt;
com.openexchange.share.staticGuestCapabilities = document_preview, text, spreadsheet&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anonymous Guest Users ===&lt;br /&gt;
&lt;br /&gt;
If a &amp;amp;quot;share link&amp;amp;quot; is created, this results in an implicit creation of an anonymous guest user account on the server. The &amp;amp;quot;secret&amp;amp;quot; to access the shared contents is the share token itself that is encoded in the generated share link, so that everybody that knows the share link is able to access the shared contents. Optionally, such an anonymous share link may be secured with an additional PIN code. Guest users will be prompted to enter this PIN code when attempting to access the share.&lt;br /&gt;
&lt;br /&gt;
To have a strict separation between different shared contents, each time a folder or item is shared using the &amp;amp;quot;Get a link&amp;amp;quot; method, a designated anonymous guest account for this share is used. Consequently, each time such an anonymous share is revoked, this guest account is terminated again with no further delay. Additionally, such an anonymous guest entity can only be applied to the permission set of the folder or item the original link was created for, i.e. it's not possible to add more shared contents to an anonymous guest - in contrast to an invited, named guest user.&lt;br /&gt;
&lt;br /&gt;
Besides the common restrictions for guest accounts outlined above, the following applies for anonymous guest user accounts:&lt;br /&gt;
&lt;br /&gt;
* No e-mail address or display name&lt;br /&gt;
* No password, if no PIN was assigned by the sharing user&lt;br /&gt;
* A password that may only be changed by editing the link, if a PIN code was set&lt;br /&gt;
* Anonymous guest users may only receive &amp;amp;quot;read-only&amp;amp;quot; access permissions to the shared item&lt;br /&gt;
* Optionally, an expiry date can be applied for an anonymous guest user after which the share link is no longer accessible&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The PIN code for anonymous guest users is stored using symmetrical encryption in the database, therefore, an encryption key needs to be specified via the property &amp;lt;code&amp;gt;com.openexchange.share.cryptKey&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Named Guest Users ===&lt;br /&gt;
&lt;br /&gt;
Internal users are able to invite a guest user to a folder or item explicitly by specifying the e-mail address of the recipient. Such &amp;amp;quot;named&amp;amp;quot; guest users are internally stored as individual guest users, identified by their e-mail address.&lt;br /&gt;
&lt;br /&gt;
If data is shared for the first time to the recipient in the context, a new guest user account is provisioned and an initial set of user permissions and capabilities is assigned. In case there are already shares in different contexts to the same recipient (based on his e-mail address), some existing user data like a display name or an assigned password is copied over if a cross-context database is available on the system.&lt;br /&gt;
&lt;br /&gt;
If the recipient has already been invited from the same or another internal user in the context to another share before, the new share is added to the guest user in a way that the underlying folder- and object permissions are taken over, and the user capabilities getting expanded as needed to cover all modules the shares are located in. Similarly, if a share to a named guest user is revoked and the underlying folder- and object-permissions are removed, the guest user capabilities are updated implicitly to reflect the modules of the remaining shares.&lt;br /&gt;
&lt;br /&gt;
After the last share to a named guest user has been revoked, the user has no longer access to any data. The account itself gets removed from the context automatically after a configurable expiry time. Additionally, any data that is stored for the guest user in the cross-context database is removed once the guest user has been deleted from all contexts in the system.&lt;br /&gt;
&lt;br /&gt;
In contrast to an &amp;amp;quot;anonymous&amp;amp;quot; guest user, a named guest user has access to all shared items from a context after logging in, since the permissions get added to an existing guest user account automatically. For entering the web interface, he may use any of the share links that were sent to him in the different notification messages. Those links usually point to an individual share target like a folder or file, but the guest user may navigate to the other shared contents using the folder tree of the web interface in the same way as regular groupware users do. Similarly, if the guest user has access to shares from different modules, the modules can be switched in the web interface as usual.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The timespan after which an unused named guest user should be removed from the system can be configured via &amp;lt;code&amp;gt;com.openexchange.share.cleanup.guestExpiry&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt; - this value may also be set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to force an immediate removal&lt;br /&gt;
* For the removal of no longer needed guest user accounts, a periodical cleanup task is scheduled based on the interval of &amp;lt;code&amp;gt;com.openexchange.share.cleanup.periodicCleanerInterval&amp;lt;/code&amp;gt;&lt;br /&gt;
* Whether a cross-context database is considered for guest users may be configured via &amp;lt;code&amp;gt;com.openexchange.share.crossContextGuests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Guest Login &amp;amp;amp; Session Handling ==&lt;br /&gt;
&lt;br /&gt;
Based on the underlying guest user account, different login operations with different authentication workflows are possible.&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
&lt;br /&gt;
We have basically three different authentication options for guest users accessing a share, each of them having their own characteristics.&lt;br /&gt;
&lt;br /&gt;
==== Anonymous ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted without providing additional authentication information, the knowledge of the link is sufficient&lt;br /&gt;
* When accessing the share link, a guest session is spawned implicitly&lt;br /&gt;
* Initially supplied cookies are considered to recycle an existing session&lt;br /&gt;
* The login screen is skipped, we'll redirect to the module/folder/item directly (using appropriate URL fragments)&lt;br /&gt;
&lt;br /&gt;
==== Anonymous with PIN ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted for anonymous guest users providing a password / PIN code&lt;br /&gt;
* When accessing the share link, the client is redirected to the login screen of the webinterface, using &amp;lt;code&amp;gt;login_type=anonymous&amp;lt;/code&amp;gt;&lt;br /&gt;
* User can then enter his PIN code, client executes the &amp;lt;code&amp;gt;anonymous_login&amp;lt;/code&amp;gt; method, server authenticates, sends back a login response containing the target in the app suite webinterface (module/folder/item)&lt;br /&gt;
* Password can't be changed by an anonymous user&lt;br /&gt;
* Password can be re-constructed / changed by sharing user&lt;br /&gt;
&lt;br /&gt;
==== Guest without Password ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted without providing additional authentication information, the knowledge of the guest's individual link is sufficient&lt;br /&gt;
* When accessing the share link, a guest session is spawned implicitly&lt;br /&gt;
* Exiting cookies are considered to recycle an existing session&lt;br /&gt;
* The login screen is skipped, we'll redirect to the module/folder/item directly (using appropriate URL fragments)&lt;br /&gt;
* Guest user may choose an individual password at a later stage&lt;br /&gt;
&lt;br /&gt;
==== Guest with Password ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted for guest users providing a user name and password.&lt;br /&gt;
* Much similar to a regular groupware user&lt;br /&gt;
* When accessing the share link, the client is redirected to the login screen of the webinterface, using &amp;lt;code&amp;gt;login_type=guest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;login_name=&amp;amp;lt;NAME&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* The login name is used to pre-fill the username input&lt;br /&gt;
* User can then enter his password, client executes the &amp;lt;code&amp;gt;guest_login&amp;lt;/code&amp;gt; method, server authenticates, sends back a login response containing the target in the app suite webinterface (module/folder/item)&lt;br /&gt;
* Password can be changed by guest user&lt;br /&gt;
* Guest user may reset his password if he can't remember&lt;br /&gt;
&lt;br /&gt;
=== Guest Hostname ===&lt;br /&gt;
&lt;br /&gt;
For serving shares, a separate guest hostname needs to be configured. This is mainly required to prevent guest- and regular user sessions using the same cookie container when logged in in the same client (otherwise, the cookie holding the alternative session identifier as well as other cookies would get overwritten concurrently). Additionally, this allows to have separate entry points to the web client for guest- and regular users. &lt;br /&gt;
&lt;br /&gt;
The hostname for guests is used when generating external share links, as well as at other locations where hyperlinks are constructed in the context of guest users. Usually, the guest hostname refers to a separate subdomain of the installation like &amp;lt;code&amp;gt;share.example.com&amp;lt;/code&amp;gt;, and is defined as an additional named virtual host pointing to the web client's document root in the webserver's configuration. &lt;br /&gt;
&lt;br /&gt;
Once the webserver configuration is done and the web client is accessible using the guest hostname, this hostname needs to be specified in the backend configuration, too. In simple scenarios, where a fixed guest hostname should be used for the installation, this can be done statically in a configuration file. This setting may also be overridden per context via the Config Cascade. In case a dedicated hostname service is installed (for example &amp;lt;code&amp;gt;open-xchange-hostname-ldap&amp;lt;/code&amp;gt;), this hostname service is also supposed to supply the guest hostname. &lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The guest hostname may be specified via &amp;lt;code&amp;gt;com.openexchange.share.guestHostname&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The guest hostname may also be supplied via dedicated hostname services like &amp;lt;code&amp;gt;open-xchange-hostname-config-cascade&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;open-xchange-hostname-ldap&amp;lt;/code&amp;gt;&lt;br /&gt;
* For test purposes, guests may also access the web interface using the same host as regular users do, however, this might lead to unexpected results (missing images, sessions timing out, auto-login malfunction...)&lt;br /&gt;
&lt;br /&gt;
=== Cookies ===&lt;br /&gt;
&lt;br /&gt;
Guest sessions basically make use of the same cookies as regular user sessions do. This includes the JSESSONID cookie for the JVM route, as well as the &amp;lt;code&amp;gt;open-xchange-secret-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-public-session-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; cookies. Additionally, if configured, the client may also issue a &amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt; request to persist the open-xchange-session-&amp;lt;hash&amp;gt; cookie. This cookie may then be used to auto-login the guest client into the previously used session if it is still valid.&lt;br /&gt;
&lt;br /&gt;
Besides the common cookies, another special cookie is set: &amp;lt;code&amp;gt;open-xchange-share-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt;. The value contains the unique share token bound to the guest user accessing the share. here, the cookie hash is calculated as it's done for ordinary sessions, so that there can only be one &amp;lt;code&amp;gt;open-xchange-share-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; cookie in a client at the same time. Whenever an auto-login request is issued by the client, the server checks for the existence of this &amp;amp;quot;share&amp;amp;quot; cookie, and, once recognized and checked for validity, it will try to perform the auto-login for an existing guest session first, i.e. using the session cookie based on the special guest hash calculation outlined above. Otherwise, the common auto-login process takes place. The &amp;amp;quot;share&amp;amp;quot; cookie is removed once the guest session terminates, i.e. the guest user logs out.&lt;br /&gt;
&lt;br /&gt;
Since guest users access the web interface on a separate (sub)domain (see [[#Guest_Hostname|Guest Hostname]] above for details), guest session cookies won't interfere with cookies of a regular session on the same client. This allows to use the regular user session as well as one or more guest sessions in parallel - e.g. if the sharing user quickly wants to check how the contents appear for the guest user after generating a share link.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Whether guest sessions are enabled for auto-login is configurable via the property &amp;lt;code&amp;gt;com.openexchange.share.autoLogin&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* By default, the cookie TTL for guest sessions is inherited from the TTL for cookies of regular sessions as defined by &amp;lt;code&amp;gt;com.openexchange.cookie.ttl&amp;lt;/code&amp;gt; - this default may be overridden by defining a timespan at &amp;lt;code&amp;gt;com.openexchange.share.cookieTTL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Login Modes ===&lt;br /&gt;
&lt;br /&gt;
When accessing a share link, one of the following login modes is triggered to acquire a session and forward the client to the share target. The executed login operation and redirect depends on the authentication mode of underlying guest account, the share target iteself, and the client accessing the share.&lt;br /&gt;
&lt;br /&gt;
==== Redirect to Target ====&lt;br /&gt;
&lt;br /&gt;
In case a share is accessible without providing credentials, the client is redirected to the share target directly, i.e. without prompting for a username or password. By default, the client is redirected to the target in the App Suite web interface by responding the &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; request to the share link with &amp;lt;code&amp;gt;HTTP 302&amp;lt;/code&amp;gt;, and a location header like the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;session=80c711019d6f48b5bec9cd82758e3308&amp;amp;amp;store=true&amp;amp;amp;user=&amp;amp;amp;user_id=642&amp;amp;amp;context_id=1&amp;amp;amp;m=files&amp;amp;amp;f=41042&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The session for the guest user is created implicitly in the backend after checking the share link's validity, and the client is instructed to store appropriate cookies in the redirect response, including the &amp;amp;quot;share&amp;amp;quot; cookie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-secret-aNobP2G9wLHJ6sMr7vtTA=38ee770d6e4f42ab8366d91db3279931; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-public-session-d0759656127fb7cee6e0fe8bb5fe19f9=cae6a3e712ac429e9da9194abd389cb3; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-share-b7gDSqJpnh9gS3Fs52I65Q=0ad50ac00418fbcdad50ac1418f94fb181d51b8fa7b2bde3; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirect to Login Screen ====&lt;br /&gt;
&lt;br /&gt;
If additional credentials, i.e. an additional PIN code or username/password combination, are required to access a share target, and no &amp;amp;quot;special client&amp;amp;quot; like an iCal consumer is detected by the backend, the client is redirected to the login screen of the app suite webinterface. The GET request to the share link is answered with statuscode HTTP 302, and a location header depending on the required credentials to access the share.&lt;br /&gt;
&lt;br /&gt;
If the share ought to be accessed anonymously, but protected by a PIN code, a location like the following is added to the response header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;share=08b4b6110151f1bd7d4b610151f0405d9fc8bb89a887f04e&amp;amp;amp;login_type=anonymous&amp;amp;amp;message_type=INFO&amp;amp;amp;message=Tony%20Parker%20has%20shared%20the%20folder%20%22Pictures%22%20with%20you.%20Please%20log%20in%20to%20view%20it.%20&amp;amp;amp;target=151ebb38&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For shares to dedicated guest users identified by their e-mail address, the redirect location looks like follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;share=4ac9eb590f9ca4d2ac9eb58f9ca611ec9b4f4638d288c8c0&amp;amp;amp;login_type=guest&amp;amp;amp;message_type=INFO&amp;amp;amp;message=Tony%20Parker%20has%20shared%20the%20file%20%22Agenda.pdf%22%20with%20you.%20Please%20log%20in%20to%20view%20it.%20&amp;amp;amp;login_name=ray%40example.com&amp;amp;amp;target=4444cbc7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The redirect response already contains the &amp;lt;code&amp;gt;Set-Cookie&amp;lt;/code&amp;gt; header for the JVM route. On the redirect target, the client should request the PIN code or password from the user, and then issue a special login request, supplying the share token and optional target from the URL parameters, and the password as URL encoded form data in the request body, similar to the usual login request via POST. After successful authentication, the login response includes, along with the common login response properties like the session identifier, information about the share target being accessed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;amp;quot;session&amp;amp;quot;:&amp;amp;quot;b89af2c2ce494ce4b4573c0632b48e89&amp;amp;quot;,&amp;amp;quot;user&amp;amp;quot;:&amp;amp;quot;ray@example.com&amp;amp;quot;,&amp;amp;quot;user_id&amp;amp;quot;:660,&amp;amp;quot;context_id&amp;amp;quot;:1,&amp;amp;quot;locale&amp;amp;quot;:&amp;amp;quot;en_US&amp;amp;quot;,&amp;amp;quot;module&amp;amp;quot;:&amp;amp;quot;files&amp;amp;quot;,&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;10&amp;amp;quot;,&amp;amp;quot;item&amp;amp;quot;:&amp;amp;quot;10/456398&amp;amp;quot;, ... }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the client is instructed to store the secret cookies:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-share-b7gDSqJpnh9gS3Fs52I65Q=0ac9eb590f9ca4d5ac9eb58f9ca641ec9b4f4638d288c8a0; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-secret-MBIRg9bJBLduCcosqQBCw=70187de16f844be6880c18be373b953d; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-public-session-d0759656127fb7cee6e0fe8bb5fe19f9=4e797a59758a4dd7b763912472ccf26d; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afterwards, the client is able to use the session to access the share target as usual.&lt;br /&gt;
&lt;br /&gt;
=== Session Lifecycle ===&lt;br /&gt;
&lt;br /&gt;
Generally, guest sessions on the server are treated just like the sessions of ordinary users. Especially, guest sessions are also held in the local session containers of the backend host they're associated with. However, by default guest sessions are marked as &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt;, i.e. they are not moved to the long-term session containers, nor they are put into the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Guest sessions are also accounted in the monitoring outputs (e.g. in the sessions per container graphs)&lt;br /&gt;
* The &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt; handling of guest sessions may be changed via the property &amp;lt;code&amp;gt;com.openexchange.share.transientSessions&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logout ===&lt;br /&gt;
&lt;br /&gt;
Guest sessions are terminated once a logout request is issued by the client, i.e. the user clicks the &amp;amp;quot;Logout&amp;amp;quot; button in the web interface, just like it is done for regular sessions. Additionally, guest sessions expire in the backend when not being used for a while, the actual timeout depends on the configured default session lifetime and whether they are treated as &amp;amp;quot;transient&amp;amp;quot; or not, as explained above.&lt;br /&gt;
&lt;br /&gt;
Since guest users are not able to use the default login page for regular users, a custom logout location for guest users should be specified where guest users are taken to after clicking logout explicitly, or if their session expired.&lt;br /&gt;
&lt;br /&gt;
If a share is consumed &amp;amp;quot;directly&amp;amp;quot;, e.g. by downloading the binary contents of a file share directly (see [[#Consuming_Shares|Consuming Shares]] for details), the guest sessions is terminated instantly after serving the request.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The logout location for guest accounts can be customized via &amp;lt;code&amp;gt;guestLogoutLocation&amp;lt;/code&amp;gt; in the file &amp;lt;code&amp;gt;as-config.yml&amp;lt;/code&amp;gt; (see file &amp;lt;code&amp;gt;as-config-default.yml&amp;lt;/code&amp;gt; for an example)&lt;br /&gt;
&lt;br /&gt;
== Share Notifications ==&lt;br /&gt;
&lt;br /&gt;
With the new sharing concept, notification mails can be sent out to the permission entities (i.e. internal or guest users) of folders or items. Mechanisms exist to send out such mails implicitly or explicitly. Notifications are sent out implicitly, if externals are invited as guests and can also be sent out for internal invitations, if configured so. The client (e.g. App Suite UI) decides on its own whether implicit notifications shall be sent when updating a folders or items permissions. Besides there are separate API calls for sending out notification messages explicitly. Its on the client to provide this functionality to its users. This makes it possible to re-send a link to a folder or item to an existing permission entity.&lt;br /&gt;
&lt;br /&gt;
Sending out links to shared folders and items is not the only case for notification messages, it can also be necessary to send out system notifications to guest users. Currently this is the case when a guest user secured his account with a password and needs to reset that password, because he cannot remember.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* A special transport must be configured for system notifications and cases where the sharing user has no configured webmail account. This transport is configured in &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt;. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
* It is possible to disable the implicit notification of internal users about shared folders or items at all by setting &amp;lt;code&amp;gt;com.openexchange.share.notifyInternal&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The layout of notifications mails can be changed via &amp;lt;code&amp;gt;as-config.yml&amp;lt;/code&amp;gt;. All available properties are defined and explained in &amp;lt;code&amp;gt;as-config-defaults.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API Access ==&lt;br /&gt;
&lt;br /&gt;
From a client's point of view, guest users basically don't differ from regular users, although they usually have limited capabilities, for example no mail access or no personal folders. However, all those differences are reflected within the regular permission- and capability-concepts, so that existing clients, once the guest user is authenticated and has a valid session, continue to work transparently, and use the same API calls as with a regular groupware user.&lt;br /&gt;
&lt;br /&gt;
To create or manage shares and guest users, the HTTP API has been extended at various locations. The following list gives an overview about the changes, derived from the corresponding software change requests.&lt;br /&gt;
&lt;br /&gt;
=== Format change for object identifiers of the default &amp;amp;quot;infostore&amp;amp;quot; account ===&lt;br /&gt;
&lt;br /&gt;
As preparation for individual object permissions where a file can be accessed from different folder &amp;amp;quot;views&amp;amp;quot;, the object IDs for documents in the default &amp;amp;quot;infostore&amp;amp;quot; file storage account will get enhanced with the prefixing folder ID.&lt;br /&gt;
&lt;br /&gt;
The identifiers will now be of format &amp;lt;code&amp;gt;&amp;amp;lt;some numbers&amp;amp;gt;/&amp;amp;lt;more numbers&amp;amp;gt;&amp;lt;/code&amp;gt;. Object identifiers are already of type &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, so this change should usually be transparent to clients. However, there may be some clever clients out there that for example tried to interpret the string of numerical characters as number, so client developers should double-check their implementation for compatibility. They most likely would run into trouble when coping with non-infostore file storages anyway.&lt;br /&gt;
&lt;br /&gt;
=== Object permissions for files ===&lt;br /&gt;
&lt;br /&gt;
In order to define permissions on object-level, a new property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; for objects of type &amp;lt;code&amp;gt;infoitem&amp;lt;/code&amp;gt; is introduced. Each time the underlying folder permissions are not sufficient to access an item, those object permissions are taken into account. Object permissions are stored as an array of Object Permission objects as defined below within the detailed infoitem data, the column ID is &amp;lt;code&amp;gt;108&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Details about the JSON structure are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedInfoitemData HTTP API: Detailed Infoitem Data]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionObject HTTP API: Object Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionFlags HTTP API: Object Permission Flags]&lt;br /&gt;
&lt;br /&gt;
=== New field for &amp;amp;quot;user&amp;amp;quot; data: &amp;amp;quot;guest_created_by&amp;amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
A new property has been introduced for users that needs to be exposed in our HTTP API, too. The following property is added to the detailed user data object:&lt;br /&gt;
&lt;br /&gt;
* ID: 616&lt;br /&gt;
* Name: guest_created_by&lt;br /&gt;
* Type: Number&lt;br /&gt;
* Value: Contains the ID of the user who has created this guest in case this user represents a guest user; it is 0 for regular users&lt;br /&gt;
&lt;br /&gt;
The property is read-only and can't be removed or set by clients.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedUserData HTTP API: Detailed User Data]&lt;br /&gt;
&lt;br /&gt;
=== Extend folder- and object permissions for addressing external guests ===&lt;br /&gt;
&lt;br /&gt;
For sharing files- or folders to external guests, the folder- and object permission objects are extended with additional properties. Those extended properties can be set during creation or update of the parent folder or file. The underlying shares and guest user entities for the referenced recipients are created automatically along with folder/file creation/update. Afterwards, the external recipients appear as regular &amp;amp;quot;user&amp;amp;quot; entities in the permission arrays in subsequent &amp;amp;quot;get&amp;amp;quot; requests.&lt;br /&gt;
&lt;br /&gt;
Details about the extended JSON structure are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#PermissionObject HTTP API: Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionObject HTTP API: Object Permission Object]&lt;br /&gt;
&lt;br /&gt;
=== New Ajax module: share/management ===&lt;br /&gt;
&lt;br /&gt;
To work with shares, a new Ajax module is introduced.&lt;br /&gt;
&lt;br /&gt;
The available actions in the module are described at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Module_.22share.2Fmanagement.22_.28preliminary.2C_available_with_v7.8.0.29 HTTP API: Module share management]&lt;br /&gt;
&lt;br /&gt;
=== New column &amp;amp;quot;shareable&amp;amp;quot; in detailed infoitem data ===&lt;br /&gt;
&lt;br /&gt;
Clients want to know quickly if an infostore item is shareable or not. A new (read-only) property named &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt; of type Boolean with column identifier &amp;lt;code&amp;gt;109&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;detailed infoitem data&amp;amp;quot;. If &amp;amp;quot;true&amp;amp;quot;, the can be considered as shareable, i.e. the item's object permissions may be adjusted by the user.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedInfoitemData HTTP API: Detailed Infoitem Data]&lt;br /&gt;
&lt;br /&gt;
=== New action &amp;amp;quot;shares&amp;amp;quot; in module folder ===&lt;br /&gt;
&lt;br /&gt;
To provide an overview of all folders of a certain modules that are shared to others, a new &amp;lt;code&amp;gt;shares&amp;lt;/code&amp;gt; action is added to the Ajax module &amp;lt;code&amp;gt;folders&amp;lt;/code&amp;gt;. It returns all personal folders of a certain module that are shared to other entities.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Get_shared_folders_.28Since_7.8.0.2C_Preliminary.29 HTTP API: Get shared folders]&lt;br /&gt;
&lt;br /&gt;
=== New action &amp;amp;quot;shares&amp;amp;quot; in module infostore ===&lt;br /&gt;
&lt;br /&gt;
To provide an overview of all files that are shared to others, a new &amp;lt;code&amp;gt;shares&amp;lt;/code&amp;gt; action is added to the Ajax module &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt;. It returns all personal files that are shared to other entities.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Get_shared_infoitems_.28Since_7.8.0.2C_Preliminary.29 HTTP API: Get shared infoitems]&lt;br /&gt;
&lt;br /&gt;
=== New fields to retrieve extended permissions of files and folders ===&lt;br /&gt;
&lt;br /&gt;
Clients would like to have more details about permission entities folders directly. A new read-only property named &amp;lt;code&amp;gt;com.openexchange.share.extendedPermissions&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;Detailed folder data&amp;amp;quot;, with column identifier &amp;lt;code&amp;gt;3060&amp;lt;/code&amp;gt;. It basically contains the same as the regular &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; array, yet enhanced by resolved information about the user, group or guest entities as well as additional, sharing-related properties.&lt;br /&gt;
&lt;br /&gt;
Similarly, a new read-only property named &amp;lt;code&amp;gt;com.openexchange.share.extendedObjectPermissions&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;Detailed infoitem data&amp;amp;quot;, with column identifier &amp;lt;code&amp;gt;7010&amp;lt;/code&amp;gt;. It basically contains the same as the regular &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; array, yet enhanced by resolved information about the user, group or guest entities as well as additional, sharing-related properties.&lt;br /&gt;
&lt;br /&gt;
Further information about the JSON structure is available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ExtendedPermissionObject HTTP API: Extended Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ExtendedObjectPermissionObject HTTP API: Extended Object Permission Object]&lt;br /&gt;
&lt;br /&gt;
== Consuming Shares ==&lt;br /&gt;
&lt;br /&gt;
Depending on the shared contents and the requesting user agent, shares may be consumed in a couple of different ways. The concrete response to a request to the share URL is evaluated by the share servlet in the backend.&lt;br /&gt;
&lt;br /&gt;
=== App Suite ===&lt;br /&gt;
&lt;br /&gt;
The default handling for all shares is forwarding them to the App Suite web interface, where the shared contents are made available through the existing client. Based on the underlying guest account, the client is either forwarded to the login prompt, or taken directly to the share target if no credentials need to be provided. This process is described in more detail at [[#Guest_Login_&amp;amp;_Session_Handling|Guest Login &amp;amp;amp; Session Handling]].&lt;br /&gt;
&lt;br /&gt;
=== Direct Download ===&lt;br /&gt;
&lt;br /&gt;
Shares to a single file may also be downloaded directly by clients, without opening them in the web interface first. This is indicated by an additional parameter appended to the plain share link, and can be specified in the following ways:&lt;br /&gt;
&lt;br /&gt;
* Append &amp;lt;code&amp;gt;dl&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?dl=true&amp;lt;/code&amp;gt;&lt;br /&gt;
* Specify &amp;lt;code&amp;gt;delivery&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?delivery=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If accessing the item requires authentication, an unauthenticated request is responded with &amp;lt;code&amp;gt;HTTP 401 Unauthorized&amp;lt;/code&amp;gt;. The client then has to provide the correct credentials to access the share via basic authentication. If there's no dedicated username for the underlying guest account - i.e. an &amp;amp;quot;anonymous&amp;amp;quot; share link protected with a PIN code is accessed - only the password is checked, i.e. the client may then supply an arbitrary username in the basic authentication header like &amp;amp;quot;Guest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get iCal ===&lt;br /&gt;
&lt;br /&gt;
Shares to a single calendar- or task-folder may also be downloaded directly by clients as iCal files, without opening them in the web interface first. This standard format allows to consume event data directly using various calendaring clients, which often can be configured to subscribe an external calendar source.&lt;br /&gt;
&lt;br /&gt;
Once a share link to a calendar- or task-folder is requested by the client, the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt;- and &amp;lt;code&amp;gt;User-Agent&amp;lt;/code&amp;gt; headers of the request are evaluated. If the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; header is either set to &amp;lt;code&amp;gt;text/calendar&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text/iCal&amp;lt;/code&amp;gt;, or if the &amp;lt;code&amp;gt;User-Agent&amp;lt;/code&amp;gt; header denotes a well-known client like Microsoft Outlook or Mozilla Thunderbird w/ Lightning, the contents of the shared folder are converted to an iCal file that is directly written back in the response.&lt;br /&gt;
&lt;br /&gt;
To force the iCal output, an additional parameter may be appended to the plain share link:&lt;br /&gt;
&lt;br /&gt;
* Append &amp;lt;code&amp;gt;ical&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?ical=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If accessing the item requires authentication, an unauthenticated request is responded with &amp;lt;code&amp;gt;HTTP 401 Unauthorized&amp;lt;/code&amp;gt;. The client then has to provide the correct credentials to access the share via basic authentication. If there's no dedicated username for the underlying guest account - i.e. an &amp;amp;quot;anonymous&amp;amp;quot; share link protected with a PIN code is accessed - only the password is checked, i.e. the client may then supply an arbitrary username in the basic authentication header like &amp;amp;quot;Guest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The interval of task- and appointment data considered for conversion to iCal can be adjusted via &amp;lt;code&amp;gt;com.openexchange.share.handler.iCal.futureInterval&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;com.openexchange.share.handler.iCal.pastInterval&amp;lt;/code&amp;gt; in configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cross-context functionality ==&lt;br /&gt;
&lt;br /&gt;
As already mentioned in previous sections the administrator is able to configure if guests should be handled per context (default) or server wide by using the configuration parameter &amp;lt;code&amp;gt;com.openexchange.share.crossContextGuests&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the guests email address is used to recognize if there is already a registered user with the given address and aligns the stored password to the already existing guest user. In addition to the password (which is the most important parameter this feature is about) even the users contact data gets synchronized.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* To handle user and contact data across contexts boundaries the feature has to be enabled before a guest receives the first share. Guests that receive shares before the activation cannot be considered within the alignment process. Only latter shares will be considered.&lt;br /&gt;
* At the moment this feature does only sync user and contact related data (no shared content). If the user got two shares from different contexts he will only see shares related to the given link.&lt;br /&gt;
&lt;br /&gt;
== Publish/Subscribe vs. Sharing ==&lt;br /&gt;
&lt;br /&gt;
The upcoming sharing features are going to replace the previously used OXMF &amp;amp;quot;publications&amp;amp;quot;, allowing guest users to interact with the shared data in the same way as regular groupware users do. However, since the underlying concepts and their technical realization are completely different, a seamless migration between publications and shares is not possible without some drawbacks.&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview of the main discrepancies:&lt;br /&gt;
&lt;br /&gt;
* Custom templates for OXMF publication targets&amp;lt;br /&amp;gt;An adminsitrator/admin may have defined some custom publication targets that are using the published data in a special way. While shares would still make all the data available (mainly via the web interface), this would only be a drop-in replacement for the ordinary &amp;amp;quot;view the publication in a browser&amp;amp;quot; use case, but not for anything beyond that scope.&lt;br /&gt;
* Subscribe of publications&amp;lt;br /&amp;gt;Publications from one user can be added to another user's groupware using the &amp;amp;quot;subscribe&amp;amp;quot; functionality, making use of the embedded microformat data of publications (OXMF). For sharing, we will not have a similar feature in the first iteration, so migrating an existing publication to a share would also stop it from being subscribable.&lt;br /&gt;
* Deep links to download files of publications&amp;lt;br /&amp;gt;Files behind an infostore publication were accessible behind a static URL, which would theoretically allow them to be requested independently of the parent publication (e.g. images linked from an external website). While the entry URL to a publication would be mappable to a corresponding share URL, converting existing publications to shares would at least break such deep links.&lt;br /&gt;
&lt;br /&gt;
Because of the above points and the whole different concept, we do not migrate existing publications to shares. Instead, the default behavior will be:&lt;br /&gt;
&lt;br /&gt;
* No new OXMF publications or subscriptions can be created by default&lt;br /&gt;
* The web client does no longer give the option to publish or subscribe in the OXMF format&lt;br /&gt;
* Existing OXMF publications / subscriptions can't be updated&lt;br /&gt;
* Existing OXMF publications continue to work as is, including associated subscriptions&lt;br /&gt;
* Yet it's still possible to delete existing publications and subscriptions&lt;br /&gt;
* Therefore, the menu section &amp;amp;quot;Publications and Subscriptions&amp;amp;quot; will still be available (if there's at least one publication or subscription)&lt;br /&gt;
&lt;br /&gt;
Exceptions to these rules cover special internal subscriptions to 3rd party services like addressbooks from LinkedIn or Xing, as well as the auto-publish feature of mail attachments exceeding a specific size.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The possibility to create/update OXMF publications via HTTP-API may be configured via &amp;lt;code&amp;gt;com.openexchange.publish.createModifyEnabled&amp;lt;/code&amp;gt; in file &amp;lt;code&amp;gt;publications.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* The possibility to create/update OXMF subscriptions via HTTP-API may be configured via &amp;lt;code&amp;gt;com.openexchange.subscribe.microformats.createModifyEnabled&amp;lt;/code&amp;gt; in file &amp;lt;code&amp;gt;microformatSubscription.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;br /&gt;
[[Category: Administrator]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21682</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21682"/>
		<updated>2016-03-21T08:51:16Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: /* Metadata format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#File_Metadata]]. If available, the requested metadata of files is included in the corresponsing &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#File_Metadata|FileMetadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;localized_name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory, if different from the physical name.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21586</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21586"/>
		<updated>2016-03-01T12:24:44Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#File_Metadata]]. If available, the requested metadata of files is included in the corresponsing &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]]. Additionally, the current checksum of the share target is included (starting with v7.8.1).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (341.8978 ms elapsed, 218 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#File_Metadata|FileMetadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot;: 1418024049629,&lt;br /&gt;
   &amp;quot;modified&amp;quot;: 1418024189166,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this folder.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this folder.&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21500</id>
		<title>HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21500"/>
		<updated>2016-02-22T06:26:13Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: /* Get all mail conversations (since v7.x) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This document defines the Open-Xchange HTTP API which is used by the new AJAX GUI. The first chapter describes general definitions and conventions which apply to all server modules. All other chapters describe individual server modules.&lt;br /&gt;
&lt;br /&gt;
=== Low level protocol ===&lt;br /&gt;
&lt;br /&gt;
The client accesses the server through HTTP GET, POST and PUT requests. HTTP cookies are used for authentication and must therefore be processed and sent back by the client as specified by [http://tools.ietf.org/html/rfc6265 RFC 6265]. The HTTP API is accessible at URIs starting with &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;. Each server module has a unique name and its own sub-namespace with that name below &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;, e. g. all access to the module &amp;quot;tasks&amp;quot; is via URIs starting with &amp;lt;code&amp;gt;/ajax/tasks&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Text encoding is always UTF-8. Data is sent from the server to the client as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; and interpreted by the client to obtain an ECMAScript object. The HTTP API uses only a small subset of the ECMAScript syntax. This subset is roughly described by the following BNF:&lt;br /&gt;
&lt;br /&gt;
 Value   ::= &amp;quot;null&amp;quot; | Boolean | Number | String | Array | Object&lt;br /&gt;
 Boolean ::= &amp;quot;true&amp;quot; | &amp;quot;false&amp;quot;&lt;br /&gt;
 Number  ::= see NumericLiteral in ECMA 262 3rd edition&lt;br /&gt;
 String  ::= \&amp;quot;([^&amp;quot;\n\\]|\\[&amp;quot;\n\\])*\&amp;quot;&lt;br /&gt;
 Array   ::= &amp;quot;[]&amp;quot; | &amp;quot;[&amp;quot; Value (&amp;quot;,&amp;quot; Value)* &amp;quot;]&amp;quot;&lt;br /&gt;
 Object  ::= &amp;quot;{}&amp;quot; | &amp;quot;{&amp;quot; Name &amp;quot;:&amp;quot; Value (&amp;quot;,&amp;quot; Name &amp;quot;:&amp;quot; Value)* &amp;quot;}&amp;quot;&lt;br /&gt;
 Name    ::= [A-Fa-f][0-9A-Fa-f_]*&lt;br /&gt;
&lt;br /&gt;
Numbers are the standard signed integer and floating point numbers. Strings can contain any character, except double quotes, newlines and backslashes, which must be escaped by a backslash. Control characters in strings (other than newline) are not supported. Whitespace is allowed between any two tokens. See [http://json.org JSON] and [http://www.ecma-international.org/publications/standards/Ecma-262.htm ECMA 262, 3&amp;lt;sup&amp;gt;rd&amp;lt;/sup&amp;gt; edition] for the formal definition.&lt;br /&gt;
&lt;br /&gt;
The response body consists of an object, which contains up to four fields as described in [[#ResponseBody | Response body]]. The field &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; contains the actual payload which is described in following chapters. The fields &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;error_params&amp;lt;/code&amp;gt; are present when data objects are returned, if an error occurred and if the error message contains conversion specifiers, respectively. Following sections describe the contents of these fields in more detail.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResponseBody&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Response body&lt;br /&gt;
! Name         !! Type      !! Value&lt;br /&gt;
|-&lt;br /&gt;
| data         || Value     || Payload of the response.&lt;br /&gt;
|-&lt;br /&gt;
| timestamp    || Timestamp || The latest timestamp of the returned data (see [[HTTP_API#Updates|Updates]]).&lt;br /&gt;
|-&lt;br /&gt;
| error        || String    || The translated error message. Present in case of errors.&lt;br /&gt;
|-&lt;br /&gt;
| error_params || Array     || As o 7.4.2: Empty JSON array. Before that: Parameters for the error message that would need to be replaced in the error string (in a printf-format style).&lt;br /&gt;
|-&lt;br /&gt;
| error_id     || String    || Unique error identifier to help finding this error instance in the server logs.&lt;br /&gt;
|-&lt;br /&gt;
| error_desc     || String    || The technical error message (always English) useful for debugging the problem. Might be the same as error message if there is no more information available&lt;br /&gt;
|-&lt;br /&gt;
| code         || String    || Error code consisting of an upper-case module identifier and a four-digit message number, separated by a dash; e.g. &amp;quot;MSG-0012&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| error_stack     || Array    || If configured (see &amp;quot;com.openexchange.ajax.response.includeStackTraceOnError&amp;quot; in 'server.properties') this field provides the stack trace of associated Java exception represented as a JSON array&lt;br /&gt;
|-&lt;br /&gt;
| categories     || String OR Array    || Either a single (String) or list (Array) of upper-case category identifiers to which the error belongs. E.g.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| &amp;quot;USER_INPUT&amp;quot;  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFIGURATION&amp;quot;  || An error related to user/system configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;PERMISSION_DENIED&amp;quot;  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRY_AGAIN&amp;quot;  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;SERVICE_DOWN&amp;quot;  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONNECTIVITY&amp;quot;  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;ERROR&amp;quot;  || A programming error which was caused by incorrect program code.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFLICT&amp;quot;  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CAPACITY&amp;quot; || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRUNCATED&amp;quot; || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;WARNING&amp;quot; || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| category     || Number    || Maintained for legacy reasons: The numeric representation of the first category:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| 2  || An error strictly related to user configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| 3  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| 5  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| 6  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| 8  || A programming error which was caused by incorrect programm code.&lt;br /&gt;
|-&lt;br /&gt;
| 9  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| 12 || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Data from the client to the server can be sent in several formats. Small amounts of data are sent as &amp;lt;code&amp;gt;application/x-www-urlencoded&amp;lt;/code&amp;gt; in query parameters in the request URI. For POST requests, some or all parameters may be sent in the request body instead of in the URI using any valid encoding for POST requests. Alternatively, some requests specify that data is sent as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; in the body of a PUT request. The format of the request body for PUT requests is the same as for sending data from the server to the client, except that the payload is sent directly, without being wrapped in another object.&lt;br /&gt;
&lt;br /&gt;
When updating existing data, the client sends only fields that were modified. To explicitly delete a field, the field is sent with the value &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. For fields of type &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, the empty string &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Error handling ===&lt;br /&gt;
&lt;br /&gt;
If the session of the user times out, if the client doesn't send a session ID or if the session for the specified session ID can not be found then the server returns the above described response object, that contains an error code and an error message. If the request URI or the request body is malformed or incomplete then the server returns the reponse object with an error message, too. In case of internal server errors, especially Java exceptions, or if the server is down, it returns the HTTP status code 503, Service Unavailable. Other severe errors may return other HTTP status values.&lt;br /&gt;
&lt;br /&gt;
Application errors, which can be caused by a user and are therefore expected during the operation of the groupware, are reported by setting the field error in the returned object, as described in [[#ResponseBody | Response body]]. Since the error messages are translated by the client, they can not be composed of multiple variable parts. Instead, the error message can contain simplified printf()-style conversion specifications, which are replaced by elements from the array in the field error_params. If error_params is not present, no replacement occurs, even if parts of the error message match the syntax of a conversion specification.&lt;br /&gt;
&lt;br /&gt;
A simplified conversion specification, as used for error messages, is either of the form %s or %''n''$s, where ''n'' is a 1-based decimal parameter index. The conversion specifications are replaced from left to right by elements from error_params, starting at the first element. %s is replaced by the current element and the current index is incremented. %''n''$s is replaced by the ''n''th element and the current index is set to the (''n'' + 1)th element.&lt;br /&gt;
&lt;br /&gt;
Some error message contain data sizes which must be expressed in Bytes or Kilobytes etc., depending on the actual value. Since the unit must be translated, this conversion is performed by the client. Unfortunately, standard printf()-style formatting does not have a specifier for this kind of translation. Therefore, the conversion specification for sizes is the same as for normal strings, and the client has to determine which parameters to translate based on the error code. The current error codes and the corresponding size parameters are listed in [[#DataSizeParameters | Data size parameters]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSizeParameters&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data size parameters&lt;br /&gt;
! Error code !! Parameter indices&lt;br /&gt;
|-&lt;br /&gt;
| CON-0101   || 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| FLS-0003   || 1, 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0065   || 1, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0066   || 1&lt;br /&gt;
|-&lt;br /&gt;
| NON-0005   || 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Date and time ===&lt;br /&gt;
&lt;br /&gt;
Dates without time are transmitted as the number of milliseconds between 00:00 UTC on that date and 1970-01-01 00:00 UTC. Leap seconds are ignored, therefore this number is always an integer multiple of 8.64e7.&lt;br /&gt;
&lt;br /&gt;
Because ECMAScript Date objects have no way to explicitly specify a timezone for calculations, timezone correction must be performed on the server. Dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''user's'' timezone and UTC at the time in question. (See the Java method java.util.TimeZone.getOffset(long)). Unless optional URL parameter &amp;lt;code&amp;gt;'''timezone'''&amp;lt;/code&amp;gt; is present. Then dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''specified'' timezone and UTC at the time in question.&lt;br /&gt;
&lt;br /&gt;
For some date and time values, especially timestamps, monotonicity is more important than the actual value. Such values are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC, ignoring leap seconds and without timezone correction. If possible, a unique strictly monotonic increasing value should be used instead, as it avoids some race conditions described below.&lt;br /&gt;
&lt;br /&gt;
This specification refers to these three interpretations of the type Number as separate data types. The types are described in [[#DateAndTimeTypes | Date and time types]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DateAndTimeTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Date and time types&lt;br /&gt;
! Type      !! Time !! Timezone !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| Date      || No   || UTC      || Date without time.&lt;br /&gt;
|-&lt;br /&gt;
| Time      || Yes  || User     || Date and time.&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || Yes  || UTC      || Timestamp or unique sequence number.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
&lt;br /&gt;
To allow efficient synchronization of a client with changes made by other clients and to detect conflicts, the server stores a timestamp of the last modification for each object. Whenever the server transmits data objects to the client, the response object described in [[#ResponseBody | Response body]] includes the field timestamp. This field contains a timestamp value which is computed as the maximum of the timestamps of all transmitted objects.&lt;br /&gt;
&lt;br /&gt;
When requesting updates to a previously retrieved set of objects, the client sends the last timestamp which belongs to that set of objects. The response contains all updates with timestamps greater than the one specified by the client. The field timestamp of the response contains the new maximum timestamp value.&lt;br /&gt;
&lt;br /&gt;
If multiple different objects may have the same timestamp values, then a race condition exists when an update is processed between two such objects being modified. The first, already modified object will be included in the update response and its timestamp will be the maximum timestamp value sent in the timestamp field of the response. If the second object is modified later but gets the same timestamp, the client will never see the update to that object because the next update request from the client supplies the same timestamp value, but only modifications with greater timestamp values are returned.&lt;br /&gt;
&lt;br /&gt;
If unique sequence numbers can't be used as timestamps, then the risk of the race condition can be at least minimized by storing timestamps in the most precise format and/or limiting update results to changes with timestamp values which are measurably smaller than the current timestamp value.&lt;br /&gt;
&lt;br /&gt;
=== Editing ===&lt;br /&gt;
&lt;br /&gt;
Editing objects is performed one object at a time. There may be multiple objects being edited by the same client simulataneously, but this is achieved by repeating the steps required for editing a single object. There is no batch edit or upload command.&lt;br /&gt;
&lt;br /&gt;
To edit an object, a client first requests the entire object from the server. The server response contains the timestamp field described in the previous section. For in-place editing inside a view of multiple objects, where only already retrieved fields can be changed, retrieving the entire object is not necessary, and the last timestamp of the view is used as the timestamp of each object in it.&lt;br /&gt;
&lt;br /&gt;
When sending the modified object back to the server, only modified fields need to be included in the sent object. The request also includes the timestamp of the edited object. The timestamp is used by the server to ensure that the object was not edited by another client in the meantime. If the current timestamp of the object is greater than the timestamp supplied by the client, then a conflict is detected and the field error is set in the response. Otherwise, the object gets a new timestamp and the response to the client is empty.&lt;br /&gt;
&lt;br /&gt;
If the client displays the edited object in a view together with other objects, then the client will need to perform an update of that view immediately after successfully uploading an edited object.&lt;br /&gt;
&lt;br /&gt;
=== File uploads ===&lt;br /&gt;
&lt;br /&gt;
File uploads are made by sending a POST request that submits both the file and the needed fields as parts of a request of content-type “multipart/form-data” or “multipart/mixed”. The file metadata are stored in a form field “file” (much like an &amp;lt;input type=”file” name=”file” /&amp;gt; would do). In general a call that allows file uploads via POST will have a corresponding call using PUT to send object data. The JSON-encoded object-data that is send as the body of a corresponding PUT call is, when performed as a POST with file uploads, put into the request parameter “json”.&lt;br /&gt;
&lt;br /&gt;
Since the upload is performed directly by the browser and is not an Ajax call, the normal callback mechanism for asynchronous Javascript calls cannot be used to obtain the result. For this reason the server responds to these POST calls with a complete HTML page that performs the callback and should not be displayed to the user. The HTML response is functionally equivalent to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
     &amp;lt;head&amp;gt;&lt;br /&gt;
         &amp;lt;META http-equiv=&amp;quot;Content-Type&amp;quot; content=\&amp;quot;text/html; charset=UTF-8\&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
             (parent[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;] || window.opener &amp;amp;&amp;amp; window.opener[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;])&lt;br /&gt;
             (&amp;lt;b&amp;gt;{json}&amp;lt;/b&amp;gt;)&lt;br /&gt;
         &amp;lt;/script&amp;gt;&lt;br /&gt;
     &amp;lt;/head&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The placeholders &amp;lt;code&amp;gt;{json}&amp;lt;/code&amp;gt; is replaced by the response with the timestamp that would be expected from the corresponding PUT method. The placeholder &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; is replaced by the value of the parameter &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; of the request (except for the import bundle, which is named &amp;quot;import&amp;quot; instead of the action name for legacy purposes). The content-type of the answer is &amp;lt;code&amp;gt;text/html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Non-browser clients don't need to interpret HTML or JavaScript. The JSON data can be recognized by the outermost &amp;lt;code&amp;gt;({&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;})&amp;lt;/code&amp;gt;, where the inner braces are part of the JSON value. For example, the regular expression &amp;lt;code&amp;gt;\((\{.*\})\)&amp;lt;/code&amp;gt; captures the entire JSON value in its first capturing group.&lt;br /&gt;
&lt;br /&gt;
=== Documentation conventions ===&lt;br /&gt;
&lt;br /&gt;
The rest of this document describes all available requests for each module. A module usually supports several different requests, which are differentiated by the used HTTP method, URI path and supplied URI parameters. The description of each method generally contains the following elements:&lt;br /&gt;
* the HTTP method followed by the request URI, inclusing the URI parameter action, which is used to differentiate methods,&lt;br /&gt;
* a list of URI parameters which can or must be supplied by the client,&lt;br /&gt;
* for PUT requests, content of the request body,&lt;br /&gt;
* for POST requests all described parameters are normally expected in the request body, exceptions are documented,&lt;br /&gt;
* &amp;quot;Response with timestamp:&amp;quot;if the timestamp field is required in the response body or simply &amp;quot;Response:&amp;quot; if not,&lt;br /&gt;
* content of the response payload, unless it is supposed to be empty.&lt;br /&gt;
&lt;br /&gt;
=== Common object data ===&lt;br /&gt;
&lt;br /&gt;
This table contains common fields which apply for any module's data type and is referenced throughout this document whenever a module's data type is described.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonObjectData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common object data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|-&lt;br /&gt;
| 100  || categories     || String  || String containing comma separated the categories. Order is preserved. Changing the order counts as modification of the object. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 101  || private_flag     || Boolean  || Overrides folder permissions in shared private folders: When true, this object is not visible to anyone except the owner. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 102  || color_label  || Number  || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive). Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 104  || number_of_attachments     || Number  || Number of attachments &lt;br /&gt;
|-&lt;br /&gt;
| 105 || lastModifiedOfNewestAttachmentUTC || Time || Date and time of the newest attachment written with UTC time zone.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;login&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The login module is used to obtain a session from the user's login credentials. To understand the details of the different login methods, see the article titled &amp;quot;[[Login variations]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Because of security reasons each login variation will reject requests containing the parameter &amp;quot;password&amp;quot; within the URL query (starting with 7.8.0).&lt;br /&gt;
&lt;br /&gt;
=== Login ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters are normally expected in the POST request body:&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password MUST be placed in the request body, otherwise the login request will be denied.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; (optional) – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method.&lt;br /&gt;
&lt;br /&gt;
=== Form Login (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=formlogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request implements a possible login to the web frontend by only using a simple HTML form. An example for such a form can be found in the backend's documentation folder (&amp;lt;code&amp;gt;/usr/share/doc/open-xchange-core&amp;lt;/code&amp;gt;) under &amp;lt;code&amp;gt;examples/login.html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client must be the same as the client sent by the UI in the normal login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI. The URL of the web UI is either taken from the given parameter or from the configured default of the backend.&lt;br /&gt;
&lt;br /&gt;
For a complete description of the FormLogin-Process please see [[FormLogin|this documentation]]&lt;br /&gt;
&lt;br /&gt;
=== Token Login (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokenLogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows every possible client to create a very short living session. This session can then be transferred to any other client preferably a browser entering then the normal web interface. Then the sessions life time will be extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Compared to the login mechanism using the random token, this request is more secure because two tokens are used. One of these tokens is only known to the client and one is generated by the server. Only the combination of both tokens allows to use the session. The combination of both tokens must be done by the client creating the session.&lt;br /&gt;
&lt;br /&gt;
DISCLAIMER: This request MUST NOT be used by some server side instance. If some server side instance uses this request to create a session for a browser on some client machine, then you have to transfer the full URL with server and client token over some connection to the client. This creates a VULNERABILITY if this is done. The token login method is only secure if this request is already sent from the same machine that later runs the browser using the created session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login information.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client should be the same as the client sent by the UI in the normal login request. For security considerations it can become necessary to define here the correct client that will use the session.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Version of the HTTP/JSON interface client. Only for statistic evaluations.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail. This must be enabled on the server and a client can test with the autologin request if it is enabled or not.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used. Currently the IP address may change when using the session with both tokens. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used. Currently the User-Agent may change when using the session. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;jsonResponse&amp;lt;/code&amp;gt; (optional, since 7.8.0) – true or false (default). Defines the returned data type as JSON. Default 'false' will return a redirect. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI (or JSON including the redirect url in case jsonResponse=true is set). The URL of the web UI is either taken from the given parameter or from the configured default of the backend. This redirect will only contain the server side token. The client side token sent in the request must be appended by the client creating the session. The final URL must have the form &amp;lt;code style=&amp;quot;white-space: nowrap&amp;quot;&amp;gt;&amp;lt;var&amp;gt;redirect_URL&amp;lt;/var&amp;gt;&amp;amp;amp;clientToken=&amp;lt;var&amp;gt;token&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;. Both tokens are necessary to use the session and both tokens must match. Otherwise the session is terminated.&lt;br /&gt;
&lt;br /&gt;
=== Tokens (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokens&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows clients to access a session created with the [[#Token_Login_.28since_7.0.1.29 | tokenLogin]] request. When accessing the session its life time is extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;serverToken&amp;lt;/code&amp;gt; – Server side identifier for accessing the session. This identifier was created by the server and is contained in the tokenLogin response.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. This identifier was created by the client and passed within the POST data of the tokenLogin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. Currently this request allows to change the client identifier for the session. This eases creating the session because the identifier of the client using the session must not be known. For security considerations it can become necessary to drop this parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object conform to the normal [[#ResponseBody | response body]] contrary to the JSON object of the normal login request. This JSON object contains the session identifier, the login, the identifier and the locale of the user.&lt;br /&gt;
&lt;br /&gt;
=== Logout ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=logout&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh secret cookie (since 6.18.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=refreshSecret&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh auto-login cookie ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=store&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Redirect ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login;jsessionid=1157370816112.OX1?action=redirect&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURITY WARNING!''' Utilizing this request is '''INSECURE'''! This request allows to access a session with a single one time token. This one time token may be delivered to the wrong client if the protocol has an error or Apache or the load balancer make a mistake. This will cause a wrong user to be in a wrong session. '''IMMEDIATELY''' consider not to use this request anymore. You have been warned. Use instead the FormLogin that does not need to use the redirect request.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;random&amp;lt;/code&amp;gt; – A session random token to jump into the session. This random token is part of the login response. Only a very short configurable time after the login it is allowed to jump into the session with the random token.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – The client can be defined here newly if it is not correct on the login request itself.&lt;br /&gt;
* &amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt; (optional) – Tells the UI to do a store request after login to be able to use autologin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – The optional path on the webserver to the UI. If this parameter is not given the configured uiWebPath is used.&lt;br /&gt;
&lt;br /&gt;
=== Change IP ===&lt;br /&gt;
&lt;br /&gt;
The following request is especially for integration with systems located in the providers infrastructure. If those systems create a session with the following request the client host IP address in the session can be changed. The IP check for following requests will be done using this newly set client host IP address.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=changeip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; – New IP address of the client host for the current session.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the string &amp;quot;1&amp;quot; as data attribute.&lt;br /&gt;
&lt;br /&gt;
=== Redeem Token (since 7.4.0)===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=redeemToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; – The token created with [[#Get_a_login_token | acquireToken]].&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request. &lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. The client must identifier must be the same for each request after creating the login session. &lt;br /&gt;
* &amp;lt;code&amp;gt;secret&amp;lt;/code&amp;gt; – The value of the secret string for token logins. This is configured through the tokenlogin-secrets configuration file.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method. If configured within tokenlogin-secrets configuration file even the user password will be returned.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;config&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The config module is used to retrieve and set user-specific configuration. The configuration is stored in a tree. Each node of the tree has a name and a value. The values of leaf nodes are strings which store the actual configuration data. The values of inner nodes are defined recursively as objects with one field for each child node. The name and the value of each field is the name and the value of the corresponding child node, respectively.&lt;br /&gt;
&lt;br /&gt;
The namespace looks like the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/ajax/config/&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; – A string containing GUI-specific settings (currently, it is a huge [[#Low_level_protocol | JSON]] object).&lt;br /&gt;
** &amp;lt;code&amp;gt;fastgui&amp;lt;/code&amp;gt; - A string containing GUI-specific settings. This is a JSON object that must be kept small for performance.&lt;br /&gt;
** &amp;lt;code&amp;gt;context_id&amp;lt;/code&amp;gt; - the unique identifier of the context (read-only, added 2008-01-28).&lt;br /&gt;
** &amp;lt;code&amp;gt;cookielifetime&amp;lt;/code&amp;gt; - the cookie life time in seconds or &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; for session cookie (read-only, added 2010-11-16).&lt;br /&gt;
** &amp;lt;code&amp;gt;identifier&amp;lt;/code&amp;gt; – the unique identifier of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;contact_id&amp;lt;/code&amp;gt; – the unique identifier of the contact data of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; – the configured language of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; – the configured timezone of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;availableTimeZones&amp;lt;/code&amp;gt; – a JSON object containing all available time zones. The key is the time zone identifier and the value contains its name in users language. (read-only, added 2010-07-08/v6.18).&lt;br /&gt;
** &amp;lt;code&amp;gt;calendarnotification&amp;lt;/code&amp;gt; - send a mail notification for appointments (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;tasknotification&amp;lt;/code&amp;gt; - send a mail notification for tasks (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;reloadTimes&amp;lt;/code&amp;gt; - Selectable times for GUI reload&lt;br /&gt;
** &amp;lt;code&amp;gt;serverVersion&amp;lt;/code&amp;gt; - Version string of the server.&lt;br /&gt;
** &amp;lt;code&amp;gt;currentTime&amp;lt;/code&amp;gt; - User timezone specific long of the current server time.&lt;br /&gt;
** &amp;lt;code&amp;gt;maxUploadIdleTimeout&amp;lt;/code&amp;gt; - Timeout after that idle uploads are deleted.&lt;br /&gt;
** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard folder of the user&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt; – the standard task folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt; – the standard calendar folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt; – the standard contacts folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt; – the private infostore folder (read-only, since v6.20.1)&lt;br /&gt;
*** &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt; – whether EAS folder selection is enabled (read-only)&lt;br /&gt;
** &amp;lt;code&amp;gt;mail/&amp;lt;/code&amp;gt; – settings for the email module (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with.  (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard email folders (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;htmlinline&amp;lt;/code&amp;gt; – activate inlining of HTML attachments. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;colorquote&amp;lt;/code&amp;gt; – color quoted lines. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;harddelete&amp;lt;/code&amp;gt; – delete emails at once. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;inlineforward&amp;lt;/code&amp;gt; – forward messages as inline or attachment. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;notifyonreadack&amp;lt;/code&amp;gt; – notify on read acknowledgement. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;msgpreview&amp;lt;/code&amp;gt; – show a message preview. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;ignorereplytext&amp;lt;/code&amp;gt; (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;nocopytosent&amp;lt;/code&amp;gt; – don't put a copy to the sent folder when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; - Spam Button should be displayed in GUI or not. (deprecated 2008-04-29)&lt;br /&gt;
** &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;autoSearch&amp;lt;/code&amp;gt; - If a search for all users, groups and resources when participant selection dialog is opened. (read-only, added 2008-10-09/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;maximumNumberParticipants&amp;lt;/code&amp;gt; – Defines the maximum number of participants for appointments and tasks. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;showWithoutEmail&amp;lt;/code&amp;gt; - If external participants without email should be shown.&lt;br /&gt;
*** &amp;lt;code&amp;gt;showDialog&amp;lt;/code&amp;gt; – Enables participant selection dialog for appointments and tasks. (read-only, added 2008-04-30/SP4)&lt;br /&gt;
** &amp;lt;code&amp;gt;availableModules&amp;lt;/code&amp;gt; – Contains a JSON array listing all enabled modules for a user. GUI loads Plugins through this list. To get your plugin listed here, create a subtree below &amp;lt;code&amp;gt;modules/&amp;lt;/code&amp;gt; without a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; subelement or with a subelement containing &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; (read-only, added 2008-02-25)&lt;br /&gt;
** &amp;lt;code&amp;gt;minimumSearchCharacters&amp;lt;/code&amp;gt; – Minimum number of characters a search pattern must have to prevent large responses and slow queries. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
** &amp;lt;code&amp;gt;modules&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;portal&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for portal module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;appendmailtext&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allowhtmlimages&amp;lt;/code&amp;gt; – Alters default setting whether external images contained in HTML content are allowed or not (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;colorquoted&amp;lt;/code&amp;gt; – color quoted lines (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectFolder&amp;lt;/code&amp;gt; – contact folder id to save mail addresses from sent mails (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectEnabled&amp;lt;/code&amp;gt; – switch contact collection on/off (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailAccess&amp;lt;/code&amp;gt; – enables/disables contact collection for incoming mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailTransport&amp;lt;/code&amp;gt; – enables/disables contact collection for outgoing mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;deletemail&amp;lt;/code&amp;gt; – delete emails or move to trash (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
***** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;forwardmessage&amp;lt;/code&amp;gt; – forward messages as inline or attachment (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for mail module&lt;br /&gt;
**** &amp;lt;code&amp;gt;inlineattachments&amp;lt;/code&amp;gt; – activate inlining of HTML attachments (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;linewrap&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – if mail module is enabled or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;phishingheaders&amp;lt;/code&amp;gt; – header(s) identifying phishing headers (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;replyallcc&amp;lt;/code&amp;gt; – put all recipients on reply all into CC (added 2008-12-16/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; – Spam Button should be displayed in GUI or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails (added 2008-02-25)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_conflict&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_teamview&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the calendar module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted appointments (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPrivate&amp;lt;/code&amp;gt; Default status for new appointments in private folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPublic&amp;lt;/code&amp;gt; Default status for new appointments in public folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the contacts module&lt;br /&gt;
**** &amp;lt;code&amp;gt;mailAddressAutoSearch&amp;lt;/code&amp;gt; – Define if a search is triggered when the recipient selection dialog is opened or the folder is changed. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; True if the contact module is enabled for the current user, false otherwise.&lt;br /&gt;
**** &amp;lt;code&amp;gt;singleFolderSearch&amp;lt;/code&amp;gt; – True if the current user is allowed to search for contacts only in a single folder. False if contact searches across all folders are allowed. (read-only, added 2009-02-04/SP5 U1)&lt;br /&gt;
**** &amp;lt;code&amp;gt;characterSearch&amp;lt;/code&amp;gt; – True if the side bar for searching for contacts by a start letter should be displayed. False if the side bar should be hidden. (read-only, added 2009-05-29/6.10)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allFoldersForAutoComplete&amp;lt;/code&amp;gt; – true if an auto complete search may omit the folder identifier array and search for contacts in all readable folders. This is configured through the contact.properties configuration file. (read-only, added 2010-07-22/v6.18.0)&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the tasks module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;delegate_tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted tasks (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined tasks created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined taks that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the infostore module&lt;br /&gt;
**** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – the standard infostore folders (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the default infostore trash folder (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;pictures&amp;lt;/code&amp;gt; – identifier of the default infostore pictures folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;documents&amp;lt;/code&amp;gt; – identifier of the default infostore documents folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;music&amp;lt;/code&amp;gt; – identifier of the default infostore music folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;videos&amp;lt;/code&amp;gt; – identifier of the default infostore videos folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;templates&amp;lt;/code&amp;gt; – identifier of the default infostore templates folder (read-only, since 7.8.0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;interfaces&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;ical&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;syncml&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; UI settings for the folder tree&lt;br /&gt;
**** &amp;lt;code&amp;gt;public_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – Selected folder tree, the user wants to use. Currents trees are 0 for the known OX folder tree and 1 for the new virtual folder tree. (added 2010-04-09/6.18)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.extras&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Extras link in the configuration (read only, added 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to change the Password within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.personaldata&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to edit personal contact information within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.group&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit groups and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.resource&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit resources and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.publish&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to publish items. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to subscribe sources. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;olox20&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Tells the UI if the user is allowed to use the OXtender for Microsoft Outlook 2. (read only, added 2011-03-15/6.20)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is set to false to prevent the UI from trying to load a plugin. (read only, added 2011-03-15/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
****&amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is true if the OXUpdater package is installed and started. (read only, added 2011-06-01/6.20)&lt;br /&gt;
****&amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Is true if the user is allowed to download the OXUpdater. Otherwise it's false. (read only, added 2011-06-01/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;showStrength&amp;lt;/code&amp;gt; – Show a widget, which displays the current passwort Strength while entering. (default: false)&lt;br /&gt;
**** &amp;lt;code&amp;gt;minLength&amp;lt;/code&amp;gt; – The minimum length of an entered password. (default: 4)&lt;br /&gt;
**** &amp;lt;code&amp;gt;maxLength&amp;lt;/code&amp;gt; – The maximum length of an entered password. 0 for unlimited. (default: 0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;regexp&amp;lt;/code&amp;gt; – Defines the class of allowed special characters as Regular Expression. (default: [^a-z0-9])&lt;br /&gt;
**** &amp;lt;code&amp;gt;special&amp;lt;/code&amp;gt; – Shows an example of allowed special characters to the user. Should be a subset of &amp;quot;regexp&amp;quot; in a human readable format. (default: $, _, or %) &lt;br /&gt;
&lt;br /&gt;
=== Get configuration data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
=== Set configuration data ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The new value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config?action=get_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1234&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
Note: Only allowed for context administrator!&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config?action=set_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to set.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the value to set; e.g&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;value&amp;quot;:&amp;quot;test1237&amp;quot;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its new value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1237&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;folders&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The folders module is used to access the OX folder structure.&lt;br /&gt;
&lt;br /&gt;
=== Special System Folders ===&lt;br /&gt;
&lt;br /&gt;
Folders with some kind of special.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! ID !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 6 || contacts || System Users&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get root folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=root&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response: An array with data for all folders at the root level of the folder structure. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common folder data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 6 || last_modified_utc || Timestamp || Timestamp of the last modification. Note that the type is Timestamp, not Time. See [[#Date and time]] for details. (added 2008-10-17, with SP5, temporary workaround)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed folder data&lt;br /&gt;
! ID  !! Name            !! Type             !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || title           || String           || Name of this folder.&lt;br /&gt;
|-&lt;br /&gt;
| 301 || module          || String           || Name of the module which implements this folder; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot;, or &amp;quot;mail&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 302 || type            || Number           || Type of folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || private&lt;br /&gt;
|-&lt;br /&gt;
| 2 || public&lt;br /&gt;
|-&lt;br /&gt;
| 3 || shared&lt;br /&gt;
|-&lt;br /&gt;
| 5 || system folder&lt;br /&gt;
|-&lt;br /&gt;
| 7 || This type is no more in use (legacy type). Will be removed with a future update!&lt;br /&gt;
|-&lt;br /&gt;
| 16 || trash&lt;br /&gt;
|-&lt;br /&gt;
| 20 || pictures&lt;br /&gt;
|-&lt;br /&gt;
| 21 || documents&lt;br /&gt;
|-&lt;br /&gt;
| 22 || music&lt;br /&gt;
|-&lt;br /&gt;
| 23 || videos&lt;br /&gt;
|-&lt;br /&gt;
| 24 || templates&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 304 || subfolders      || Boolean          || true if this folder has subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || own_rights      || Number or String || Permissions which apply to the current user, as described either in [[#PermissionFlags | Permission flags]] or in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| 306 || permissions     || Array            || Each element is an object described in [[#PermissionObject | Permission object]].&lt;br /&gt;
|-&lt;br /&gt;
| 307 || summary         || String           || Information about contained objects.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || standard_folder || Boolean          || Indicates whether or not folder is marked as a default folder (only OX folder)&lt;br /&gt;
|-&lt;br /&gt;
| 309 || total           || Number           || The number of objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 310 || new             || Number           || The number of new objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 311 || unread          || Number           || The number of unread objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 312 || deleted         || Number           || The number of deleted objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 313 || capabilities || Number || Bit mask containing information about mailing system capabilites, as described in [[#Capabilities | capabilities]].&lt;br /&gt;
|-&lt;br /&gt;
| 314 || subscribed || Boolean || Indicates whether this folder should appear in folder tree or not. '''Note:''' Standard folders cannot be unsubscribed.&lt;br /&gt;
|-&lt;br /&gt;
| 315 || subscr_subflds || Boolean || Indicates whether subfolders should appear in folder tree or not.&lt;br /&gt;
|-&lt;br /&gt;
| 316 || standard_folder_type || Number || Indicates the default folder type. Zero for non-default folder. See [[#DefaultTypes | Standard folder types]]&lt;br /&gt;
|-&lt;br /&gt;
| 317 || supported_capabilities || Array || Each element is a String identifying a supported folder capability as described in [[#SupportedCapabilities | supported capabilities]]. Only applicable for non-mail folders. Read Only, Since 7.4.0.&lt;br /&gt;
|-&lt;br /&gt;
| 318 || account_id || String || Will be &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; if the folder does not belong to any account&lt;br /&gt;
(i.e. if its module doesn't support multiple accounts), is a virtual folder or an account-agnostic system folder. Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 3010 || com.openexchange.publish.publicationFlag || Boolean || Indicates whether this folder is published. Read Only, provided by the com.openexchange.publish plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3020 || com.openexchange.subscribe.subscriptionFlag || Boolean || Indicates whether this folder has subscriptions storing their content in this folder. Read Only, provided by the com.openexchange.subscribe plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3030 || com.openexchange.folderstorage.displayName || String || Provides the display of the folder's owner. Read Only, Since 6.20.&lt;br /&gt;
|-&lt;br /&gt;
| 3060 || com.openexchange.share.extendedPermissions || Array || Each element is an object described in [[#ExtendedPermissionObject | Extended permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  0-6 || Folder permissions:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || See the folder.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Create objects in the folder. '''Note''': '''Does not apply to folders of module ''system'''''.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || Create subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Create subfolders&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&amp;lt;br&amp;gt;'''NOTE''': ''Create objects in the folder'' is not covered by ''Create subfolders'' if folder's module is ''system''.&lt;br /&gt;
|-&lt;br /&gt;
|  7-13 || Read permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Read only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Read all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Read all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 14-20 || Write permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Modify only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Modify all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Modify all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 21-27 || Delete permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Delete only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Delete all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Delete all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 28    || Admin flag:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Every operation modifying the folder in some way requires this permission. This are e.g. changing the folder name, modifying the permissions, deleting or moving the folder.&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || For non-mail folders, a number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| rights || String  || For mail folders, the rights string as defined in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capabilities&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Mailing system supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Mailing system supports ordering mails by their thread reference.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Mailing system supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Mailing system supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Mailing system supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note''': Capabilities describe the entire mailing system (mail account), not the specific folder in which they are transmitted. E.g. bit 4 of the capabilities on the user's inbox describes whether subscriptions are supported by the default account, even though the inbox itself cannot be unsubscribed because it's a standard folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DefaultTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Standard Folder Types&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || No default folder.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Task.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Calendar.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Contact.&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Inbox.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Infostore.&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Drafts.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Sent.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Spam.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Trash.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SupportedCapabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Supported Capabilities&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| permissions || Folder storage supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| publication || Folder storage supports folder publication.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Folder storage supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| sort || Folder storage supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| subscription || Folder storage supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get subfolders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;errorOnDuplicateName&amp;lt;/code&amp;gt; – An optional flag to enable or disable (default) check for duplicate folder names within returned folder response (since v6.20.1). If a duplicate folder name is detected, an appropriate error is returned as [[#ResponseBody | response]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders, which have the folder with the requested object ID as parent. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get path ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of a folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all parent nodes until root folder. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for new, modified and deleted folders. New and modified folders are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted folders (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a folder ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested folder. The fields of the object are listed in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id is not present. Since OX access controls are folder-based, the folder object also defines the permissions for the objects it contains. The permissions for a given user or group are defined by the object described in [[#PermissionObject | Permission object]]. The format of the actual permissions depends on the type of the folder. The permissions of mail folders are transmitted as a rights string as defined in section 3 of RFC 2086. Permissions of all other folders are transmitted as a single nonnegative integer number. The permissions for any given action on the folder or on contained objects is defined by a group of bits in the binary representation of this number. Each group of bits is interpreted as a separate number. Zero always means &amp;quot;no permissions&amp;quot;. Any other values add new permissions and always include the permissions of all lower values. The individual values are described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
&lt;br /&gt;
=== Update a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated folder. If the folder was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;cascadePermissions&amp;lt;/code&amp;gt; – (Optional. Defaults to false) Flag to cascade permissions to all sub-folders. The user must have administrative permissions to all sub-folders subject to change. If one permission change fails, the entire operation fails. (Since 7.8.0)&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. Only modified fields are present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder_id&amp;lt;/code&amp;gt; – The parent folder of the newly created folder&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id should not be present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provided that permission is granted to create a folder, its module is bound to the limitation, that the new folder's module must be equal to parent folder's module except that:&lt;br /&gt;
* Parent folder is one of the system folders &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt;. Below these folders task, calendar, and contact modules are permitted.&lt;br /&gt;
* Parent folder's module is one of task, calendar, or contact. Below this kind of folders task, calendar, and contact modules are permitted.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created folder.&lt;br /&gt;
&lt;br /&gt;
=== Delete folders ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The optional timestamp of the last update of the deleted folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered. &lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the folders are deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the folders are not yet located below the trash folder, they are moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of the folders that shall be deleted.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of folders that were '''NOT''' deleted. There may be a lot of different causes for a not deleted folder: A folder has been modified in the mean  time, the user does not have the permission to delete it or those permissions have just been removed, the folder does not exist, etc.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content  ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=clear&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
=== Get all visible folder of a certain module  (since v6.18.2)  ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=allVisible&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;)&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; –  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object containing three fields: &amp;quot;private&amp;quot;, &amp;quot;public, and &amp;quot;shared&amp;quot;. Each field is a JSON array with data for all folders. Each folder is itself described by an array.&lt;br /&gt;
&lt;br /&gt;
=== Get shared folders (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. \&amp;quot;tasks\&amp;quot;, \&amp;quot;calendar\&amp;quot;, \&amp;quot;contacts\&amp;quot;, \&amp;quot;infostore\&amp;quot;). Note: this action is not implemented for module &amp;quot;mail&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders that are considered as shared by the user. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared folder (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared folder to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;tasks&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The tasks module is used to access task information.&lt;br /&gt;
&lt;br /&gt;
=== Get all tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskAndAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task and appointment data&lt;br /&gt;
! ID  !! Name                     !! Type         !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 200 || title                    || String       || Short description.&lt;br /&gt;
|-&lt;br /&gt;
| 201 || start_date               || Date or Time || Inclusive start of the event as Date for tasks and whole day appointments and Time for normal appointments. For sequencies, this date must be part of the sequence, i. e. sequencies always start at this date. (deprecated for tasks since v7.6.1, replaced by start_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 202 || end_date                 || Date or Time || Exclusive end of the event as Date for tasks and whole day appointments and as Time for normal appointments.  (deprecated for tasks since v7.6.1, replaced by end_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 203 || note                     || String       || Long description.&lt;br /&gt;
|-&lt;br /&gt;
| 204 || alarm                    || Number or Time || Specifies when to notify the participants as the number of minutes before the start of the appointment (-1 for &amp;quot;no alarm&amp;quot;). For tasks, the Time value specifies the absolute time when the user should be notified.&lt;br /&gt;
|-&lt;br /&gt;
| 209 || recurrence_type          || Number       || Specifies the type of the recurrence for a task sequence:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none (single event)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || daily&lt;br /&gt;
|-&lt;br /&gt;
| 2 || weekly&lt;br /&gt;
|-&lt;br /&gt;
| 3 || monthly&lt;br /&gt;
|-&lt;br /&gt;
| 4 || yearly&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 212 || days                     || Number       || Specifies which days of the week are part of a sequence. The value is a bitfield with bit 0 indicating sunday, bit 1 indicating monday and so on. May be present if recurrence_type &amp;gt; 1. If allowed but not present, the value defaults to 127 (all 7 days).&lt;br /&gt;
|-&lt;br /&gt;
| 213 || day_in_month             || Number       || Specifies which day of a month is part of the sequence. Counting starts with 1. If the field &amp;quot;days&amp;quot; is also present, only days selected by that field are counted. If the number is bigger than the number of available days, the last available day is selected. Present if and only if recurrence_type &amp;gt; 2.&lt;br /&gt;
|-&lt;br /&gt;
| 214 || month                    || Number       || Month of the year in yearly sequencies. 0 represents January, 1 represents February and so on. Present if and only if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 215 || interval                 || Number       || Specifies an integer multiplier to the interval specified by recurrence_type. Present if and only if recurrence_type &amp;gt; 0. Must be 1 if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 216 || until                    || Date         || Inclusive end date of a sequence. May be present only if recurrence_type &amp;gt; 0. The sequence has no end date if recurrence_type &amp;gt; 0 and this field is not present. Note: since this is a Date, the entire day after the midnight specified by the value is included.&lt;br /&gt;
|-&lt;br /&gt;
| 217 || notification             || Boolean      || If true, all participants are notified of any changes to this object. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client.&lt;br /&gt;
|-&lt;br /&gt;
| 220 || participants             || Array        || Each element identifies a participant, user, group or booked resource as described in [[#Participant | participant table]].&lt;br /&gt;
|-&lt;br /&gt;
| 221 || users                    || Array        || Each element represents a participant as described in [[#UserParticipantObject | User participant object]]. User groups are resolved and are represented by their members. Any user can occur only once.&lt;br /&gt;
|-&lt;br /&gt;
| 222 || occurrences || Number || Specifies how often a recurrence should appear. May be present only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 223 || uid || String || Can only be written when the object is created. Internal and external globally unique identifier of the appointment or task. Is used to recognize appointments within iCal files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 224 || organizer || String || Contains the email address of the appointment organizer which is not necessarily an internal user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 225 || sequence || Number || iCal sequence number. Not implemented for tasks. Must be incremented on update. Will be incremented by the server, if not set.&lt;br /&gt;
|-&lt;br /&gt;
| 226 || confirmations || Array || Each element represents a confirming participant as described in [[#ConfirmingParticipant | confirming participant]]. This can be internal and external user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 227 || organizerId || Number || Contains the userIId of the appointment organizer if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 228 || principal || String || Contains the email address of the appointment principal which is not necessarily an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 229 || principalId || Number || Contains the userIId of the appointment principal if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 401 || full_time   || Boolean || True if the event is a whole day appointment or task, false otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Participant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant identifier&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || User ID&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 2 || user group&lt;br /&gt;
|-&lt;br /&gt;
| 3 || resource&lt;br /&gt;
|-&lt;br /&gt;
| 4 || resource group&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || mail address of an external participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UserParticipantObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | User participant object&lt;br /&gt;
! Name           !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id             || Number || User ID. Confirming for other users only works for appointments and not for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| display_name   || String || Displayable name of the participant.&lt;br /&gt;
|-&lt;br /&gt;
| confirmation   || Number ||&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| confirmmessage || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConfirmingParticipant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Confirming participant&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || email address of external participant&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || display name of external participant&lt;br /&gt;
|-&lt;br /&gt;
| status || Number ||&lt;br /&gt;
{|&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| message || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task data&lt;br /&gt;
! ID  !! Name              !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || status            || Number || Status of the task:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || not started&lt;br /&gt;
|-&lt;br /&gt;
| 2 || in progress&lt;br /&gt;
|-&lt;br /&gt;
| 3 || done&lt;br /&gt;
|-&lt;br /&gt;
| 4 || waiting&lt;br /&gt;
|-&lt;br /&gt;
| 5 || deferred&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 301 || percent_completed || Number || How much of the task is completed. An integer number between 0 and 100.&lt;br /&gt;
|-&lt;br /&gt;
| 302 || actual_costs|| Number || A monetary attribute to store actual costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 303 || actual_duration&lt;br /&gt;
|-&lt;br /&gt;
| 304 || after_complete || Date || Deprecated. Only present in AJAX interface. Value will not be stored on OX server.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || billing_information&lt;br /&gt;
|-&lt;br /&gt;
| 307 || target_costs|| Number || A monetary attribute to store target costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || target_duration&lt;br /&gt;
|-&lt;br /&gt;
| 309 || priority || Number || 1 = LOW, 2 = MEDIUM, 3 = HIGH&lt;br /&gt;
|-&lt;br /&gt;
| 312 || currency&lt;br /&gt;
|-&lt;br /&gt;
| 313 || trip_meter&lt;br /&gt;
|-&lt;br /&gt;
| 314 || companies&lt;br /&gt;
|-&lt;br /&gt;
| 315 || date_completed&lt;br /&gt;
|-&lt;br /&gt;
| 316 || start_time               || Date or Time || Inclusive start as Date for whole day tasks and Time for normal tasks. &lt;br /&gt;
|-&lt;br /&gt;
| 317 || end_time                 || Date or Time || Exclusive end as Date for whole day tasks and as Time for normal tasks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested tasks.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; – Which kinds of updates should be ignored. Omit this parameter or set it to &amp;quot;deleted&amp;quot; to not have deleted tasks identifier in the response. Set this parameter to &amp;quot;false&amp;quot; and the response contains deleted tasks identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted tasks. New and modified tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted tasks would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a task ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the task's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested task. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder Identifier through that the task is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated task.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated task. If the task was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
=== Create a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created task.&lt;br /&gt;
&lt;br /&gt;
=== Delete task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An object in the field “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete tasks (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Confirm task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the to confirm task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through that the task is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirm task.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot; and &amp;quot;confirmmessage&amp;quot; as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Search for tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified , then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object with attributes described in [[#SearchTasks | Search tasks]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchTasks&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search tasks&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find tasks. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || (optional) Defines the folder to search for tasks in. If this is omitted in all task folders will be searched.&lt;br /&gt;
|-&lt;br /&gt;
| start || Date or Time || (optional) Inclusive start date for a time range the tasks should end in. If start is omitted end is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| end || Date or Time || (optional) Exclusive end date for a time range the tasks should end in. If this parameter is omitted the time range has an open end.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with matching tasks. Tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;contacts&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The contacts module is used to access contact information.&lt;br /&gt;
&lt;br /&gt;
=== Get all contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried (optional from 6.22.2 on: If not set, the contents of all visible folders are used instead).&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedContactData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed contact data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 223 ||  || uid         || String || Can only be written when the object is created. Internal and external globally unique identifier of the contact. Is used to recognize contacts within vCard files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 500 || Display name                || display_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 501 || Given name                  || first_name           || String || First name.&lt;br /&gt;
|-&lt;br /&gt;
| 502 || Sur name                    || last_name            || String || Last name.&lt;br /&gt;
|-&lt;br /&gt;
| 503 || Middle name                 || second_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 504 || Suffix                      || suffix               || String&lt;br /&gt;
|-&lt;br /&gt;
| 505 || Title                       || title                || String&lt;br /&gt;
|-&lt;br /&gt;
| 506 || Street home                 || street_home          || String&lt;br /&gt;
|-&lt;br /&gt;
| 507 || Postal code home            || postal_code_home || String&lt;br /&gt;
|-&lt;br /&gt;
| 508 || City home                   || city_home            || String&lt;br /&gt;
|-&lt;br /&gt;
| 509 || State home                  || state_home           || String&lt;br /&gt;
|-&lt;br /&gt;
| 510 || Country home                || country_home         || String&lt;br /&gt;
|-&lt;br /&gt;
| 511 || Birthday                    || birthday             || Date&lt;br /&gt;
|-&lt;br /&gt;
| 512 || Marital status              || marital_status || String&lt;br /&gt;
|-&lt;br /&gt;
| 513 || Number of children          || number_of_children || String&lt;br /&gt;
|-&lt;br /&gt;
| 514 || Profession                  || profession           || String&lt;br /&gt;
|-&lt;br /&gt;
| 515 || Nickname                    || nickname             || String&lt;br /&gt;
|-&lt;br /&gt;
| 516 || Spouse name                 || spouse_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 517 || Anniversary                 || anniversary          || Date&lt;br /&gt;
|-&lt;br /&gt;
| 518 || Note                        || note                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 519 || Department                  || department           || String&lt;br /&gt;
|-&lt;br /&gt;
| 520 || Position                    || position             || String&lt;br /&gt;
|-&lt;br /&gt;
| 521 || Employee type               || employee_type  || String&lt;br /&gt;
|-&lt;br /&gt;
| 522 || Room number                 || room_number || String&lt;br /&gt;
|-&lt;br /&gt;
| 523 || Street business             || street_business      || String&lt;br /&gt;
|-&lt;br /&gt;
| 524 || Internal user id            || user_id || Number&lt;br /&gt;
|-&lt;br /&gt;
| 525 || Postal code business        || postal_code_business || String&lt;br /&gt;
|-&lt;br /&gt;
| 526 || City business               || city_business        || String&lt;br /&gt;
|-&lt;br /&gt;
| 527 || State business              || state_business       || String&lt;br /&gt;
|-&lt;br /&gt;
| 528 || Country business            || country_business     || String&lt;br /&gt;
|-&lt;br /&gt;
| 529 || Number of employee          || number_of_employees || String&lt;br /&gt;
|-&lt;br /&gt;
| 530 || Sales volume                || sales_volume || String&lt;br /&gt;
|-&lt;br /&gt;
| 531 || Tax id                      || tax_id               || String&lt;br /&gt;
|-&lt;br /&gt;
| 532 || Commercial register         || commercial_register  || String&lt;br /&gt;
|-&lt;br /&gt;
| 533 || Branches                    || branches             || String&lt;br /&gt;
|-&lt;br /&gt;
| 534 || Business category           || business_category    || String&lt;br /&gt;
|-&lt;br /&gt;
| 535 || Info                        || info                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 536 || Manager's name              || manager_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 537 || Assistant's name            || assistant_name       || String&lt;br /&gt;
|-&lt;br /&gt;
| 538 || Street other                || street_other         || String&lt;br /&gt;
|-&lt;br /&gt;
| 539 || City other                  || city_other           || String&lt;br /&gt;
|-&lt;br /&gt;
| 540 || Postal code other           || postal_code_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 541 || Country other               || country_other        || String&lt;br /&gt;
|-&lt;br /&gt;
| 542 || Telephone business 1        || telephone_business1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 543 || Telephone business 2        || telephone_business2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 544 || FAX business                || fax_business         || String&lt;br /&gt;
|-&lt;br /&gt;
| 545 || Telephone callback          || telephone_callback   || String&lt;br /&gt;
|-&lt;br /&gt;
| 546 || Telephone car               || telephone_car        || String&lt;br /&gt;
|-&lt;br /&gt;
| 547 || Telephone company           || telephone_company    || String&lt;br /&gt;
|-&lt;br /&gt;
| 548 || Telephone home 1            || telephone_home1      || String&lt;br /&gt;
|-&lt;br /&gt;
| 549 || Telephone home 2            || telephone_home2      || String&lt;br /&gt;
|-&lt;br /&gt;
| 550 || FAX home                    || fax_home             || String&lt;br /&gt;
|-&lt;br /&gt;
| 551 || Cellular telephone 1        || cellular_telephone1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 552 || Cellular telephone 2        || cellular_telephone2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 553 || Telephone other             || telephone_other      || String&lt;br /&gt;
|-&lt;br /&gt;
| 554 || FAX other                   || fax_other            || String&lt;br /&gt;
|-&lt;br /&gt;
| 555 || Email 1                     || email1               || String&lt;br /&gt;
|-&lt;br /&gt;
| 556 || Email 2                     || email2               || String&lt;br /&gt;
|-&lt;br /&gt;
| 557 || Email 3                     || email3               || String&lt;br /&gt;
|-&lt;br /&gt;
| 558 || URL                         || url                  || String&lt;br /&gt;
|-&lt;br /&gt;
| 559 || Telephone ISDN              || telephone_isdn       || String&lt;br /&gt;
|-&lt;br /&gt;
| 560 || Telephone pager             || telephone_pager      || String&lt;br /&gt;
|-&lt;br /&gt;
| 561 || Telephone primary           || telephone_primary    || String&lt;br /&gt;
|-&lt;br /&gt;
| 562 || Telephone radio             || telephone_radio      || String&lt;br /&gt;
|-&lt;br /&gt;
| 563 || Telephone telex             || telephone_telex      || String&lt;br /&gt;
|-&lt;br /&gt;
| 564 || Telephone TTY/TDD           || telephone_ttytdd     || String&lt;br /&gt;
|-&lt;br /&gt;
| 565 || Instantmessenger 1          || instant_messenger1   || String&lt;br /&gt;
|-&lt;br /&gt;
| 566 || Instantmessenger 2          || instant_messenger2   || String&lt;br /&gt;
|-&lt;br /&gt;
| 567 || Telephone IP                || telephone_ip         || String&lt;br /&gt;
|-&lt;br /&gt;
| 568 || Telephone assistant         || telephone_assistant  || String&lt;br /&gt;
|-&lt;br /&gt;
| 569 || Company                     || company              || String&lt;br /&gt;
|-&lt;br /&gt;
| 570 ||                             || image1 || String&lt;br /&gt;
|-&lt;br /&gt;
| 571 || Dynamic Field 1             || userfield01 || String&lt;br /&gt;
|-&lt;br /&gt;
| 572 || Dynamic Field 2             || userfield02 || String&lt;br /&gt;
|-&lt;br /&gt;
| 573 || Dynamic Field 3             || userfield03 || String&lt;br /&gt;
|-&lt;br /&gt;
| 574 || Dynamic Field 4             || userfield04 || String&lt;br /&gt;
|-&lt;br /&gt;
| 575 || Dynamic Field 5             || userfield05 || String&lt;br /&gt;
|-&lt;br /&gt;
| 576 || Dynamic Field 6             || userfield06 || String&lt;br /&gt;
|-&lt;br /&gt;
| 577 || Dynamic Field 7             || userfield07 || String&lt;br /&gt;
|-&lt;br /&gt;
| 578 || Dynamic Field 8             || userfield08 || String&lt;br /&gt;
|-&lt;br /&gt;
| 579 || Dynamic Field 9             || userfield09 || String&lt;br /&gt;
|-&lt;br /&gt;
| 580 || Dynamic Field 10            || userfield10 || String&lt;br /&gt;
|-&lt;br /&gt;
| 581 || Dynamic Field 11            || userfield11 || String&lt;br /&gt;
|-&lt;br /&gt;
| 582 || Dynamic Field 12            || userfield12 || String&lt;br /&gt;
|-&lt;br /&gt;
| 583 || Dynamic Field 13            || userfield13 || String&lt;br /&gt;
|-&lt;br /&gt;
| 584 || Dynamic Field 14            || userfield14 || String&lt;br /&gt;
|-&lt;br /&gt;
| 585 || Dynamic Field 15            || userfield15 || String&lt;br /&gt;
|-&lt;br /&gt;
| 586 || Dynamic Field 16            || userfield16 || String&lt;br /&gt;
|-&lt;br /&gt;
| 587 || Dynamic Field 17            || userfield17 || String&lt;br /&gt;
|-&lt;br /&gt;
| 588 || Dynamic Field 18            || userfield18 || String&lt;br /&gt;
|-&lt;br /&gt;
| 589 || Dynamic Field 19            || userfield19 || String&lt;br /&gt;
|-&lt;br /&gt;
| 590 || Dynamic Field 20            || userfield20 || String || Contains a UUID if one was assigned (after 6.18.2)&lt;br /&gt;
|-&lt;br /&gt;
| 592 ||                             || distribution_list    || Array  || If this contact is a distribution list, then this field is an array of objects. Each object describes a member of the list as defined in [[#DistributionListMember | Distribution list member]].&lt;br /&gt;
|-&lt;br /&gt;
| 594 || Number of distributionlists || number_of_distribution_list || Number&lt;br /&gt;
|-&lt;br /&gt;
| 596 ||                             || number_of_images || Number&lt;br /&gt;
|-&lt;br /&gt;
| 597 ||                             || image_last_modified || Timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 598 || State other                 || state_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 599 ||                             || file_as || String&lt;br /&gt;
|-&lt;br /&gt;
| 601 ||                             || image1_content_type || String&lt;br /&gt;
|-&lt;br /&gt;
| 602 ||                             || mark_as_distributionlist || Boolean&lt;br /&gt;
|-&lt;br /&gt;
| 605 || Default address             || default_address || Number&lt;br /&gt;
|-&lt;br /&gt;
| 606 ||                             || image1_url || String&lt;br /&gt;
|-&lt;br /&gt;
| 608 ||                             || useCount || Number || In case of sorting purposes the column 609 is also available, which places global address book contacts at the beginning of the result. If 609 is used, the order direction (ASC, DESC) is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 610 ||                             || yomiFirstName || String || Kana based representation for the First Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 611 ||                             || yomiLastName || String || Kana based representation for the Last Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 612 ||                             || yomiCompany || String || Kana based representation for the Company. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 613 ||                             || addressHome || String || Support for Outlook 'home' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 614 ||                             || addressBusiness || String || Support for Outlook 'business' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 615 ||                             || addressOther || String || Support for Outlook 'other' address field. (since 6.20.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DistributionListMember&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Distribution list member&lt;br /&gt;
! Name       !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id         || String || Object ID of the member's contact if the member is an existing contact.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Parent folder ID of the member's contact if the member is an existing contact (preliminary, from 6.22 on).&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| mail       || String || Email address (mandatory before 6.22, afterwards optional if you are referring to an internal contact)&lt;br /&gt;
|-&lt;br /&gt;
| mail_field || Number || Which email field of an existing contact (if any) is used for the mail field.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || independent contact&lt;br /&gt;
|-&lt;br /&gt;
| 1 || default email field (email1)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || second email field (email2)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || third email field (email3)&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects. Each object contains fields “id” and “folder” of requested contacts.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=listuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with id&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
Available with SP4&lt;br /&gt;
&lt;br /&gt;
=== Get updated contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested contacts.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted contacts. New and modified contacts are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted contacts (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a contact ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the contact's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Get contact by user ID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=getuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – User ID (not Object ID) of the requested user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. &lt;br /&gt;
&lt;br /&gt;
Available with SP4 package.&lt;br /&gt;
&lt;br /&gt;
=== Update a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder identifier through that the contact is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated contact. If the contact was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
To remove some contact image send the image attribute set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To change or add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File_uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Create a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created contact.&lt;br /&gt;
&lt;br /&gt;
To add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Delete contacts (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected contacts with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchContacts | Search contacts]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContacts&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find contacts. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves. Matching is performed against any substring of the field &amp;lt;code&amp;gt;display_name&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search contacts with the given startletter. If this field is present, the pattern is matched against the contact field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Array of Number || If a list of folder identifiers or at least a single folder identifier is given, only in that folders will be searched for contacts. This paramenter is optional but searching in all contact folders that are viewable and where objects can be read in is more expensive on that database than searching in a dedicated number of them. The possibility to provide here an array of folder identifier has been added with 6.10.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchContactsAlternative | Search contacts alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContactsAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches contacts where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches contacts where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches contacts where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| email1 || String || Searches contacts where the email1 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email2 || String || Searches contacts where the email2 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email3 || String || Searches contacts where the email3 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| company || String || Searches contacts where the company match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| categories || String || Searches contacts where the categories match with the given search pattern. &lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, a contact is returned if any specified pattern matches at the start of the corresponding field. Otherwise, a contact is returned if all specified patterns match any substring of the corresponding field.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed as if orSearch were set to true. The actual value of orSearch is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| exactMatch || Boolean || If set to true, contacts are returned where the specified patterns match the corresponding fields exactly. Otherwise, a 'startsWith' or 'substring' comparison is used based on the 'orSearch' parameter. (requires version &amp;gt; 6.22.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by filter (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=advancedSearch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#Module_.22search.22_.28alternative_suggestion.2C_still_preliminary.29 | Search Filter]]&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by anniversary (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose anniversary falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=anniversaries&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their anniversary in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by birthday (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose birthday falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=birthdays&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their birthday in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Auto-complete contacts (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts based on a prefix, usually used to auto-complete e-mail recipients while the user is typing.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; – The query to search for.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; (optional)  – Whether to only include contacts with at least one e-mail address. Defaults to &amp;quot;true&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. Since 7.8.1: If this parameter is missing, response is sorted by a user-specific use count of contacts, ID of contacts' parent folder and display name.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is &lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;calendar&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The calendar module is used to access calendar data.&lt;br /&gt;
&lt;br /&gt;
=== Get all appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) – Object ID of the folder, whose contents are queried. If not specified, defaults to all calendar folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which start on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which end before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Appointment sequencies are broken up into individual appointments and each occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed appointment data&lt;br /&gt;
! ID  !! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 206 || recurrence_id            || Number       || Object ID of the entire appointment sequence. Present on series and change exception appointments. Equals to object identifier on series appointment and is different to object identifier on change exceptions.&lt;br /&gt;
|-&lt;br /&gt;
| 207 || recurrence_position      || Number       || 1-based position of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 208 || recurrence_date_position || Date         || Date of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 210 || change_exceptions                     || Array       || An array of Dates, representing all change exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 211 || delete_exceptions                     || Array       || An array of Dates, representing all delete exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 400 || location    || String  || Location&lt;br /&gt;
|-&lt;br /&gt;
| 402 || shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 408 || timezone    || String  || Timezone&lt;br /&gt;
|-&lt;br /&gt;
| 410 || recurrence_start    || Date  || Start of a sequence without time&lt;br /&gt;
|-&lt;br /&gt;
|  || ignore_conflicts || Boolean  || Ignore soft conflicts for the new or modified appointment. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get appointment information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=has&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response is an array of booleans. Array length is the number of days. Each entry in the array corresponds with one day in the range that was queried, explaining whether there is an appointment on this day or not.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with full object IDs (folder, id and optionally either recurrence_position or recurrence_date_position) of requested appointments.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an appointment&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| pos  || Number || Value of the field recurrence_position, if present in the appointment.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get updated appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried. That parameter may be absent in case &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is set to &amp;quot;deleted&amp;quot;, which means all accessible calendar folders are considered. If  &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is not set to &amp;quot;deleted&amp;quot;, that parameter is mandatory.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested appointments.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted appointments. New and modified appointments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted appointments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by objects described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]] instead of arrays. Appointment sequencies are broken up into individual appointments and each modified occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
=== Get an appointment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_position&amp;lt;/code&amp;gt; (optional) – Recurrence Position requested appointment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested appointment. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the appointment's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated appointment. If the appointment was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field recurrence_id is always present if it is present in the original appointment. The field recurrence_position is present if it is present in the original appointment and only this single appointment should be modified. The field id is not present because it is already included as a parameter. Other fields are present only if modified.&lt;br /&gt;
&lt;br /&gt;
=== Create an appointment ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: If the appointment was created successfully, an object with the attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created appointment. If the appointment could not be created due to conflicts, the response body is an object with the field &amp;lt;code&amp;gt;conflicts&amp;lt;/code&amp;gt;, which is an array of appointment objects which caused the conflict. Each appointment object which represents a resource conflict contains an additional field &amp;lt;code&amp;gt;hard_conflict&amp;lt;/code&amp;gt; with the Boolean value true. If the user does not have read access to a conflicting appointment, only the fields &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;end_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shown_as&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; are present and the field &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; contains only the participants which caused the conflict.&lt;br /&gt;
&lt;br /&gt;
=== Delete an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: The appointment object to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Delete appointments (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of appointment objects to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Confirm appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the appointment to confirm.&lt;br /&gt;
* &amp;lt;code&amp;gt;occurrence&amp;lt;/code&amp;gt; – The numeric identifier of the occurrence to which the confirmation applies (in case &amp;quot;id&amp;quot; denotes a series appointment). Available with v7.6.0&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through which the appointment is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirmed appointment.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot;, &amp;quot;confirmmessage&amp;quot; and &amp;quot;id&amp;quot; (optional) as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Free &amp;amp; Busy ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - Internal user id. Must be obtained from the contact module.&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; - Constant for user or resource (1 for users, 3 for resources)&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which lie between start and end as described.&amp;lt;br&amp;gt;&lt;br /&gt;
This objects consist of:&lt;br /&gt;
{| id=&amp;quot;FreeAndBusyAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| start_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|- &lt;br /&gt;
| end_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Folder ID. Only set, if the user has the right to see the object. (added 2009-08-18/6.12) &lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean || True if the appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Search appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchAppointments&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search appointments&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find appointments. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search appointments with the given starting letter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get new appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=newappointments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; – limits the number of returned object to the given value.&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Resolve UID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=resolveuid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The UID to be resolved.&lt;br /&gt;
&lt;br /&gt;
Response: An object object with the field &amp;quot;id&amp;quot; containing the ox-object id, if existing, an error message otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Get all Change Exceptions (Since v7.2.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=getChangeExceptions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object id of the appointment series.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointments. &lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The mail module is used to access mail data.&lt;br /&gt;
&lt;br /&gt;
When mails are stored on an IMAP server, some functionality is not available due to restrictions of the IMAP protocol. Such functionality is marked with &amp;quot;not IMAP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get mail count ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=count&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder whose mail count is queried&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An integer value representing folder's mail count&lt;br /&gt;
&lt;br /&gt;
=== Get all mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedMailData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed mail data&lt;br /&gt;
! ID  !! Name                 !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 102 || color_label || Number || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive).&lt;br /&gt;
|-&lt;br /&gt;
| 600 || id                   || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 601 || folder_id            || String  || Object ID of the parent folder&lt;br /&gt;
|-&lt;br /&gt;
| 602 || attachment           || Boolean || Specifies whether this mail has attachments.&lt;br /&gt;
|-&lt;br /&gt;
| 603 || from                 || Array   || Each element is a two-element array specifying one sender. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values.&lt;br /&gt;
|-&lt;br /&gt;
| 604 || to                   || Array   || Each element is a two-element array (see the from field) specifying one receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 605 || cc                   || Array   || Each element is a two-element array (see the from field) specifying one carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 606 || bcc                  || Array   || Each element is a two-element array (see the from field) specifying one blind carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 607 || subject              || String  || Subject line.&lt;br /&gt;
|-&lt;br /&gt;
| 608 || size                 || Number  || Size of the mail in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 609 || sent_date            || Time    || Date and time as specified in the mail by the sending client.&lt;br /&gt;
|-&lt;br /&gt;
| 610 || received_date        || Time    || Date and time as measured by the receiving server.&lt;br /&gt;
|-&lt;br /&gt;
| 611 || flags                || Number  || Various system flags. A sum of zero or more of following values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || answered&lt;br /&gt;
|-&lt;br /&gt;
| 2  || deleted&lt;br /&gt;
|-&lt;br /&gt;
| 4  || draft&lt;br /&gt;
|-&lt;br /&gt;
| 8  || flagged&lt;br /&gt;
|-&lt;br /&gt;
| 16 || recent&lt;br /&gt;
|-&lt;br /&gt;
| 32 || seen&lt;br /&gt;
|-&lt;br /&gt;
| 64 || user&lt;br /&gt;
|-&lt;br /&gt;
| 128 || spam&lt;br /&gt;
|-&lt;br /&gt;
| 256 || forwarded&lt;br /&gt;
|}&lt;br /&gt;
See javax.mail.Flags.Flag for details.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || level                || Number  || Zero-based nesting level in a thread.&lt;br /&gt;
|-&lt;br /&gt;
| 613 || disp_notification_to || String  || Content of message's header “Disposition-Notification-To”&lt;br /&gt;
|-&lt;br /&gt;
| 614 || priority             || Number  || Value of message's “X-Priority” header:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0   || No priority&lt;br /&gt;
|-&lt;br /&gt;
| 5   || Very Low&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Low&lt;br /&gt;
|-&lt;br /&gt;
| 3   || Normal&lt;br /&gt;
|-&lt;br /&gt;
| 2   || High&lt;br /&gt;
|-&lt;br /&gt;
| 1   || Very High&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 615  || msg_ref                 || String  || Message reference on reply/forward.&lt;br /&gt;
|-&lt;br /&gt;
| 651  || flag_seen                 || String  || Special field to sort mails by seen status&lt;br /&gt;
|-&lt;br /&gt;
| 652  || account_name                 || String  || Message's account name.&lt;br /&gt;
|-&lt;br /&gt;
| 653  || account_id                 || int  || Message's account identifier. Since v6.20.2&lt;br /&gt;
|-&lt;br /&gt;
|     || user                 || Array  || An array with user-defined flags as strings.&lt;br /&gt;
|-&lt;br /&gt;
|     || headers                 || Object  || An object with a field for every non-standard header. The header name is the field name. The header value is the value of the field as string.&lt;br /&gt;
|-&lt;br /&gt;
|     || attachments          || Array   || Each element is an attachment as described in [[#Attachment | Attachment]]. The first element is the mail text. If the mail has multiple representations (multipart-alternative), then the alternatives are placed after the mail text and have the field disp set to alternative.&lt;br /&gt;
|-&lt;br /&gt;
|     || nested_msgs          || Array   || Each element is a mail object as described in this table, except for fields id, folder_id and attachment.&lt;br /&gt;
|-&lt;br /&gt;
|     || truncated          || boolean   || true/false if the mail content was trimmed. Since v7.6.1&lt;br /&gt;
|-&lt;br /&gt;
|     || source             || String    || RFC822 source of the mail. Only present for &amp;lt;tt&amp;gt;action=get&amp;amp;attach_src=true&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|     || cid                || String    || The value of the &amp;quot;Content-ID&amp;quot; header, if the header is present.&lt;br /&gt;
|-&lt;br /&gt;
| 654  || original_id                 || String  || The original mail identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|-&lt;br /&gt;
| 655  || original_folder_id                 || String  || The original folder identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Attachment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || String || Object ID (unique only inside the same message)&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || MIME type&lt;br /&gt;
|-&lt;br /&gt;
| content      || String || Content as text. Present only if easily convertible to text.&lt;br /&gt;
|-&lt;br /&gt;
| filename     || String || Displayed filename (mutually exclusive with content).&lt;br /&gt;
|-&lt;br /&gt;
| size         || Number || Size of the attachment in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| disp         || String || Attachment's disposition: null, inline, attachment or alternative.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all mail conversations (since v7.x) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=threadedAll&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;includeSent&amp;lt;/code&amp;gt; - A boolean value to signal that conversations also include messages taken from special &amp;quot;sent&amp;quot; aka &amp;quot;sent items&amp;quot; folder&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON array consisting of JSON objects, each representing a conversation's root message along with its message thread. The root message's JSON object is filled according to specified columns and is enhanced by special &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field representing the full message thread (including the root message itself). The &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field is a JSON array of JSON objects; each representing a message in the conversation sorted by time-line, also filled with specified columns. E.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
   &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
   &amp;quot;unreadCount&amp;quot;:0,&lt;br /&gt;
   &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
   &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
   &amp;quot;thread&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263853&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;26323&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/Sent&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263854&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Search mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON array of JSON objects each containing the search field and its search pattern: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;col&amp;quot;: 612, &amp;quot;pattern&amp;quot;: &amp;quot;Joe&amp;quot;}, {&amp;quot;col&amp;quot;: 614, &amp;quot;pattern&amp;quot;: &amp;quot;Tuesday&amp;quot;}]&amp;lt;/code&amp;gt; Supported values for &amp;lt;code&amp;gt;col&amp;lt;/code&amp;gt; are 603 to 607 (from, to, cc, bcc and subject) and -1 for full text search.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;headers&amp;lt;/code&amp;gt; - (preliminary) A comma-separated list of header names. Each name requests denoted header from each mail&lt;br /&gt;
&lt;br /&gt;
Request body: An array with one object for each requested mail. Each object contains the fields &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter followed by requested headers.&lt;br /&gt;
&lt;br /&gt;
=== Copy mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the copied mail&lt;br /&gt;
&lt;br /&gt;
=== Move mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the moved mail&lt;br /&gt;
&lt;br /&gt;
=== Update mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
'''Note''': If neither parameter &amp;quot;&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&amp;quot; nor parameter &amp;quot;&amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt;&amp;quot; is specified, all folder's messages are updated accordingly. Available with v6.20.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object which carries the new values that ought to be applied to mail as described in [[#UpdateMail | Update mail]] or [[#UpdateMailExtended | Update mail extended]] (available with SP6 v6.10).&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the Object ID of the updated mail and its folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMail&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| color_label || Number || The color number between 0 and 10.&lt;br /&gt;
|-&lt;br /&gt;
| flags || Number || A set of flags to add or remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| value || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to add the flags specified by &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (logical OR), &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to remove them (logical AND with the inverted value).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMailExtended&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail extended (available with SP6 v6.10)&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| set_flags || Number || A set of flags to add. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| clear_flags || Number || A set of flags to remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mark all mails as seen (available with v7.6.0) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=all_seen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: n.a.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Not IMAP: Get updated mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Just an empty JSON array is going to be returned since this action cannot be applied to IMAP.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the mail's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; (optional) – 1 indicates that this request should fill the message compose dialog to edit a message and thus display-specific date is going to be withheld.&lt;br /&gt;
* &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain only the (formatted) message headers as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain the complete message source as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; (optional) – 1 to write the complete message source to output stream. '''NOTE:''' This parameter will only be used if parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; is set to 1.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP4)&lt;br /&gt;
** &amp;quot;raw&amp;quot; returns the content as it is, meaning no preparation are performed and thus no guarantee for safe contents is given (available with SP6 v6.10).&lt;br /&gt;
** &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML.&lt;br /&gt;
** &amp;quot;textNoHtmlAttach&amp;quot; is the same as &amp;quot;text&amp;quot;, but does not deliver the HTML part as attachment in case of multipart/alternative content.&lt;br /&gt;
** &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).&lt;br /&gt;
** &amp;quot;noimg&amp;quot; to allow a possible HTML content being transferred but without original image src attributes which references external images: Can be used to prevent loading external linked images (spam privacy protection).&lt;br /&gt;
** '''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;unseen&amp;lt;/code&amp;gt; (optional) – &amp;quot;1&amp;quot; or &amp;quot;true&amp;quot; to leave an unseen mail as unseen although its content is requested&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
* &amp;lt;code&amp;gt;attach_src&amp;lt;/code&amp;gt; (optional - available since v7.6.1) 1 to let the JSON mail representation being extended by &amp;lt;code&amp;gt;&amp;quot;source&amp;quot;&amp;lt;/code&amp;gt; field containing the mail raw RFC822 source data&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included. '''NOTE:''' Of course response is not a JSON object if either parameter &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; or parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; are set to &amp;quot;1&amp;quot;. Then the response contains plain text. Moreover if optional parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to &amp;quot;1&amp;quot; the complete message source is going to be directly written to output stream to open browser's save dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mails as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_messages&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; –  A comma-separated list of Object IDs of the requested mails&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=attachment&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – ID of the requested attachment '''OR'''&lt;br /&gt;
* &amp;lt;code&amp;gt;cid&amp;lt;/code&amp;gt; – Value of header 'Content-ID' of the requested attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; – 1 overwrites the defined mimetype for this attachment to force the download dialog, otherwise 0.&lt;br /&gt;
* &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt; (optional) – 1 to apply HTML white-list filter rules if and only if requested attachment is of MIME type &amp;lt;code&amp;gt;text/htm*&amp;lt;/code&amp;gt; '''AND''' parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to 0.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this attachment, except the parameter save is set to 1.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mail attachments as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachments.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – A comma-separated list of IDs of the requested attachments&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Send a mail ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;lineWrapAfter&amp;lt;/code&amp;gt; – An integer value specifying the line-wrap setting (only effective for plain-text content); if absent the setting is taken from user's mail settings. Available with v7.8.1.&lt;br /&gt;
&lt;br /&gt;
Request Body: This method uses the encoding multipart/form-data or multipart/mixed.&lt;br /&gt;
* The form filed &amp;lt;code&amp;gt;json_0&amp;lt;/code&amp;gt; contains the rudimentary mail as JSON object as described in [[#DetailedMailData | Detailed mail data]] with just its message body (as html content) defined in nested JSON array &amp;quot;attachments&amp;quot; and its header data (from, to, subject, etc.). The field &amp;quot;content_type&amp;quot; defines whether the mail ought to be sent as plain text (&amp;quot;text/plain&amp;quot;), as html (&amp;quot;text/html&amp;quot;) or  as multipart/alternative (&amp;quot;ALTERNATIVE&amp;quot;). Sending a mail requires some special fields inside JSON mail object. The field &amp;quot;infostore_ids&amp;quot; defines a JSON array of infostore document ID(s) that ought to be appended to this mail as attachments. The field &amp;quot;msgref&amp;quot; indicates the ID of the referenced original mail. Moreover the field &amp;quot;sendtype&amp;quot; indicates the type of the message:&lt;br /&gt;
** 0 - A normal new mail (optional)&lt;br /&gt;
** 1 - A reply mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 2 - A forward mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 3 - A draft edit operation. The field &amp;quot;msgref&amp;quot; must be present in order to delete previous draft message since e.g. IMAP does not support changing/replacing a message but requires a delete-and-insert sequence&lt;br /&gt;
** 4 - Transport of a draft mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 6 - This type signals that user intends to send out a saved draft message and expects the draft message (referenced by &amp;quot;msgref&amp;quot; field) being deleted after successful transport&lt;br /&gt;
Example of a normal new mail which appends user's VCard and requests a read receipt from receiver:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Content-Disposition: form-data; name=&amp;quot;json_0&amp;quot;....{&amp;quot;from&amp;quot;:&amp;quot;\u0022Muster, Karl\u0022 &amp;lt;karl.muster@somewhere.com&amp;gt;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;someone@somewhere.com&amp;quot;,&amp;quot;cc&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bcc&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;subject&amp;quot;:&amp;quot;Mail Subject&amp;quot;,&amp;quot;priority&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;disp_notification_to&amp;quot;:true,&amp;quot;vcard&amp;quot;:1,&lt;br /&gt;
&amp;quot;attachments&amp;quot;:[{&amp;quot;content_type&amp;quot;:&amp;quot;ALTERNATIVE&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;Simple Mail Text!&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;\u000a\u000a&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* The request accepts file fields in upload form that denote referenced files that are going to be appended as attachments&lt;br /&gt;
* For &amp;quot;text/plain&amp;quot; mail bodies, the JSON boolean field &amp;quot;raw&amp;quot; may be specified inside the body's JSON representation to signal that the text content shall be kept as-is; meaning to keep all formatting intact&lt;br /&gt;
&lt;br /&gt;
==== Attach data sources ====&lt;br /&gt;
Moreover the JSON representation may contain data sources which should be appended as file attachments to the mail. Then the mail contains the &amp;lt;code&amp;gt;&amp;quot;datasources&amp;quot;&amp;lt;/code&amp;gt; key which is expected to be a JSON array of data source descriptions.&lt;br /&gt;
&lt;br /&gt;
A data source description follows the [[#Module_.22conversion.22_.28preliminary.29 | conversion specification]].&lt;br /&gt;
&lt;br /&gt;
For example to attach a file through an URL the field looks like this (available with v6.18.2):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;from&amp;quot;: &amp;quot;someone@somewhere.com,&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;quot;datasources&amp;quot;&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;identifier&amp;quot;: &amp;quot;com.openexchange.url.mail.attachment&amp;quot;,&lt;br /&gt;
   &amp;quot;args&amp;quot;:&lt;br /&gt;
    {&lt;br /&gt;
     &amp;quot;url&amp;quot;: &amp;lt;url-string&amp;gt;,&lt;br /&gt;
     &amp;quot;timeout&amp;quot;: &amp;lt;optional-timeout-millis-int, default is 2500msec&amp;gt;,&lt;br /&gt;
     &amp;quot;contentType&amp;quot;: &amp;lt;optional-content-type-string&amp;gt;,&lt;br /&gt;
     &amp;quot;charset&amp;quot;: &amp;lt;optional-charset-string&amp;gt;,&lt;br /&gt;
     &amp;quot;size&amp;quot;: &amp;lt;optional-size-int&amp;gt;,&lt;br /&gt;
     &amp;quot;disposition&amp;quot;: &amp;lt;optional-disposition-string&amp;gt;,&lt;br /&gt;
     &amp;quot;fileName&amp;quot;: &amp;lt;optional-file-name-string&amp;gt;,&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created mail.&lt;br /&gt;
&lt;br /&gt;
=== Send/Save mail as MIME data block (RFC822) (added in SP5) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) - In case the mail should not be sent out, but saved in a specific folder, the &amp;quot;folder&amp;quot; parameter can be used. If the mail should be sent out to the recipient, the &amp;quot;folder&amp;quot; parameter must not be included and the mail is stored in the folder &amp;quot;Sent Items&amp;quot;. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. If no &amp;quot;folder&amp;quot;  parameter is specified, this parameter must not be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
 &lt;br /&gt;
Request Body: The MIME Data Block&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created/moved mail.&lt;br /&gt;
&lt;br /&gt;
=== Import of mails as MIME data block (RFC822) (added with 6.18) ===&lt;br /&gt;
&lt;br /&gt;
This request can be used to store a single or a lot of mails in the OX mail storage backend. This action should be used instead of &amp;lt;code&amp;gt;action=new&amp;lt;/code&amp;gt; because it is faster and tolerant to 8bit encoded emails.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /ajax/mail?action=import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - For the import this parameter is required to specify the folder into that the emails should be imported. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
*&amp;lt;code&amp;gt;force&amp;lt;/code&amp;gt; (optional) - If this parameter is set to true, the server skips checking the valid From-address&lt;br /&gt;
 &lt;br /&gt;
Request Body: A multipart/form-data with a single or multiple file parts each having a different name and containing the RFC822 encoded email as binary data like in a file upload.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the folder identifier and the object identifier of the imported mail or a JSON array of those JSON objects if multiple mails are imported.&lt;br /&gt;
&lt;br /&gt;
=== Reply/Forward a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=forward&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested Message.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP6) - &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML. &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).'''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;setFrom&amp;lt;/code&amp;gt; (optional - available since v7.6.0) A flag (&amp;quot;true&amp;quot;/&amp;quot;false&amp;quot;) that signals if &amp;quot;From&amp;quot; header shall be pre-selected according to a suitable recipient address that matches one of user's E-Mail address aliases; only supported for &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included.&lt;br /&gt;
&lt;br /&gt;
=== Delete mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects providing folder IDs and object IDs of the deleted mails.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/INBOX&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;123&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/MyFolder&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;134&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not IMAP: Response: An array with object IDs of mails which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Clear mail folder(s) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=clear&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with IDs of the mail folders to clear&lt;br /&gt;
&lt;br /&gt;
Response: An array with IDs of mail folder that could not be cleared; meaning the response body is an empty JSON array if everything went well.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge receipt ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=receipt_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the &amp;quot;from address&amp;quot;, the id of the folder and the mail id: e.g.: {&amp;quot;from&amp;quot;:&amp;quot;mymail@domain.com&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;1234&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object with an empty data field if everything went well or a JSON object containing the error information.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;groups&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The group module allows to query available groups. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get a group ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The group id.&lt;br /&gt;
&lt;br /&gt;
Response: A group object as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== List groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with group identifiers.&lt;br /&gt;
&lt;br /&gt;
Response: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== Search for groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#GroupSearch | Group search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find groups. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group data&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name         || String || Name with character restrictions&lt;br /&gt;
|-&lt;br /&gt;
| members       || Array  || The array contains identifier of users that are member of the group.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created group.&lt;br /&gt;
&lt;br /&gt;
=== Delete a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the group to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the group.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the group was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the group to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the group to update. If the group was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested groups.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted groups. New, modified and deleted groups are represented by JSON objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;resource&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The resource module allows to query available resources. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get all resources ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource identifier.&lt;br /&gt;
&lt;br /&gt;
=== List resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An array with resources ids.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Get a resource ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The resource id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Search for resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#ParticipantSearch | Participant search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ParticipantSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find resources. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResourceResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Resource Response&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name || String || internal name&lt;br /&gt;
|-&lt;br /&gt;
| mailaddress || String || email address&lt;br /&gt;
|-&lt;br /&gt;
| availability || Boolean || can be false to mark the resource currently unavailable&lt;br /&gt;
|-&lt;br /&gt;
| description || String || description of the resource&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified_utc || Timestamp || Date and time of the last modification.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: An object with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created resource.&lt;br /&gt;
&lt;br /&gt;
=== Delete a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resource was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Delete resources (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resources were deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the resource to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the resource to update. If the resource was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested resources.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted resources. New, modified and deleted resources are represented by JSON objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;infostore&amp;quot; or &amp;quot;Filestore&amp;quot; or &amp;quot;Files&amp;quot; or &amp;quot;Drive&amp;quot; ==&lt;br /&gt;
This module has been renamed quite often. Whatever its name, it combines the knowledge database, bookmarks and document storage.&lt;br /&gt;
&lt;br /&gt;
=== Get all infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedInfoitemData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed infoitem data&lt;br /&gt;
! ID  !! Name            !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 108 || object_permissions           || Array  || Each element is an object described in [[#ObjectPermissionObject | Object Permission object]] (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 109 || shareable       || Boolean || (read-only) Indicates if the item can be shared (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 700 || title           || String  || Title&lt;br /&gt;
|-&lt;br /&gt;
| 701 || url             || String  || Link/URL&lt;br /&gt;
|-&lt;br /&gt;
| 702 || filename        || String  || Displayed filename of the document.&lt;br /&gt;
|-&lt;br /&gt;
| 703 || file_mimetype   || String  || MIME type of the document. The client converts known types to more readable names before displaying them.&lt;br /&gt;
|-&lt;br /&gt;
| 704 || file_size       || Number  || Size of the document in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 705 || version         || Number  || Version number of the document. New documents start at 1. Every update increments the version by 1.&lt;br /&gt;
|-&lt;br /&gt;
| 706 || description     || String  || Description&lt;br /&gt;
|-&lt;br /&gt;
| 707 || locked_until    || Time    || The time until which this item will presumably be locked. Only set if the docment is currently locked, 0 otherwise.&lt;br /&gt;
|-&lt;br /&gt;
| 708 || file_md5sum     || String  || MD5Sum of the document. Not yet implemented, so this is currently always empty.&lt;br /&gt;
|-&lt;br /&gt;
| 709 || version_comment || String  || A version comment is used to file a changelog for the file.&lt;br /&gt;
|-&lt;br /&gt;
| 710 || current_version || Boolean || “true” if this version is the current version “false” otherwise. Note: This is not writeable&lt;br /&gt;
|-&lt;br /&gt;
| 711 || number_of_versions || Number || The number of all versions of the infoitem. Note: This is not writeable.&lt;br /&gt;
|-&lt;br /&gt;
| 7010 || com.openexchange.share.extendedObjectPermissions || Array || Each element is an object described in [[#ExtendedObjectPermissionObject | Extended object permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 7020 || com.openexchange.realtime.resourceID || String || The resource identifier for the infoitem for usage within the realtime component. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies.&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user.&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended object permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || The numerical value indicating no object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || The numerical value indicating read object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || The numerical value indicating write object permissions. This implicitly includes the “read” permission (this is no bitmask).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of requested infoitems.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted infoitems. New and modified infoitems are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted infoitems (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested infoitem. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Search infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) – The folder ID to restrict the search to. If not specified, all folders are searched.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields as per tables [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; (optional) – The start index (inclusive) in the ordered search, that is requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; (optional) – The last index (inclusive) from the ordered search, that is requested.&lt;br /&gt;
&lt;br /&gt;
Request body: The search pattern string in a JSON object named &amp;quot;pattern&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem document ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt;(optional) – If present the response declares the given content_type in the Content-Type header.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem or the content_type given.&lt;br /&gt;
&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get a ZIP archive containing the infoitems of a denoted folder (available with v7.6.1) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=zipfolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;recursive&amp;lt;/code&amp;gt; – &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to also include subfolders and their infoitems respectively; otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to only consider the infoitems of specified folder&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP archive. The response type for the HTTP Request is set to &amp;lt;code&amp;gt;application/zip&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Get all versions ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=versions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem whose versions are requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. The timestamp is the timestamp relating to the requested infostore item.&lt;br /&gt;
&lt;br /&gt;
=== Check if file name is valid (since 7.8.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=checkname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – Name of the file to check.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object when file name is valid.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple documents as a ZIP archive (available with v7.4.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=zipdocuments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; – A URL-encoded JSON array; see below for details&lt;br /&gt;
&lt;br /&gt;
Parameter &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;: A JSON array of JSON object tuples specifying the documents' versions to include in the requested ZIP archive; e.g&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[{&amp;quot;id&amp;quot;:&amp;quot;61820&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;61821&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;}]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The field &amp;lt;code&amp;gt;&amp;quot;version&amp;quot;&amp;lt;/code&amp;gt; is optional; if missing it refers to latest/current version.&amp;lt;br&amp;gt;&lt;br /&gt;
So, a valid parameter would look like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;body=%5B%7B%22id%22%3A%2261820%22%2C%22folder%22%3A%2270303%22%7D%2C%7B%22id%22%3A%2261821%22%2C%22folder%22%3A%2270303%22%2C%22version%22%3A%221%22%7D%5D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The download offer for the requested ZIP archive containing specified document versions&lt;br /&gt;
&lt;br /&gt;
=== Move one or more infoitems via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=move&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the destination folder.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array consisting of JSON objects each referencing to an existing infoitem that is supposed to be moved to the destination folder&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36639&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;},&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36641&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array consisting of those identifiers that could not be moved (due to a conflict) or an empty JSON array if everything went fine&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; – Optionally sets the start offset in bytes where to append the data to the document, must be equal to the actual document's length (available with v7.8.1). Only available if the underlying [[#FileStorageAccount | File storage account]] supports the &amp;quot;RANDOM_FILE_ACCESS&amp;quot; capability.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem. The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Save an attachment in the infostore ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=saveAs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object with the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;Attachment&amp;lt;/code&amp;gt; – The id of the attachement to save.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. The fields in this infoitem object override values from the attachment. The folder_id must be given. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Delete infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the file is deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the file is not yet located below the trash folder, it is moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects to delete. The fields for the object are described in [[#FullIdentifierForAnInfostoreDocument|Full identifier for an infostore document]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with [[]]. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnInfostoreDocument&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an infostore document&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || Folder ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: A List of arrays with the version numbers of the infoitems to detach.&lt;br /&gt;
&lt;br /&gt;
Response: An array with version numbers that were not deleted.&lt;br /&gt;
&lt;br /&gt;
Note: When the current version of a document is deleted the new current version will be the newest version.&lt;br /&gt;
&lt;br /&gt;
=== Delete all versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=revert&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Removes all versions of the infostore document leaving only the base object.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
Response: The id of the newly created object&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Lock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=lock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be locked.&lt;br /&gt;
* &amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt; (optional) – If present the value is added to the current time on the server (both in ms). The document will be locked until that time. If this parameter is not present, the document will be locked for a duration as configured on the server.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only include errors.&lt;br /&gt;
&lt;br /&gt;
=== Unlock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=unlock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be unlocked.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only contain errors.&lt;br /&gt;
&lt;br /&gt;
=== Get shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared infoitem to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;Attachments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Attachment Module allows file attachments to arbitrary objects. An Attachment always belongs to an object (called 'attached') in a certain folder of a certain module.  &lt;br /&gt;
&lt;br /&gt;
=== Get All Attachments for an Object ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachment's are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of attachments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Create an Attachment ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/attachment?action=attach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json_[index]&amp;lt;/code&amp;gt; – The JSON representation of an attachment object as described in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;file_[index]&amp;lt;/code&amp;gt; – The file metadata as per &amp;lt;input type=file /&amp;gt; upload.&lt;br /&gt;
&lt;br /&gt;
Note: The JSON Object and file fields describe the corresponding attachment. For ex.: json_0 contains metadata for file_0, json_1 for file_1 and so on. Indexes start with 0.&lt;br /&gt;
&lt;br /&gt;
Request body: multipart/form-data or multipart/mixed containing the file data of the attached file and the above fields.&lt;br /&gt;
&lt;br /&gt;
Response: HTML page with javascript callback as per introduction. Contains a JSON-Array of ids of the newly created attachments. The order of the ids corresponds to the indexes in the request.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AttachmentObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment Object&lt;br /&gt;
! ID  !! Name          !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 800 || folder        || Number  || The ID of the first Folder in which the attached object resides.&lt;br /&gt;
|-&lt;br /&gt;
| 801 || attached      || Number  || The object id of the object this attachement is attached to.&lt;br /&gt;
|-&lt;br /&gt;
| 802 || module        || Number  || The Module of this Object Possible Values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1   || Appointment&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Task&lt;br /&gt;
|-&lt;br /&gt;
| 7   || Contact&lt;br /&gt;
|-&lt;br /&gt;
| 137 || Infostore&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 803 || filename      || String  || The filename of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 804 || file_size     || Number  || The file size (in bytes) of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 805 || file_mimetype || String  || The MIME-Type of the attached file&lt;br /&gt;
|-&lt;br /&gt;
| 806 || rft_flag      || Boolean || If the attachment is a RTF Attachment of Outlook. (Outlook descriptions can be stored as RTF Documents).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete Attachment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ids of the attachments to delete.&lt;br /&gt;
&lt;br /&gt;
=== Get updated attachments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
ignore (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new and deleted attachments for the specified object. New attachments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted attachments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain numbers, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attahment?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested attachment. The fields of the object are listed in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]]. &lt;br /&gt;
&lt;br /&gt;
=== Get an attachments filedata ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; (optional) – If set the responses Content-Type header is set to this value, not the attachements file mime type.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem.&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;reminder&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The reminder module provides the ability to fetch all active reminders for a user between two dates.&lt;br /&gt;
&lt;br /&gt;
=== Get reminder range ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/reminder?action=range&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The End date of the reminder range&lt;br /&gt;
&lt;br /&gt;
Response: An Array with all reminders which are scheduled until the specified time. Each reminder is described in [[#ReminderResponse | Reminder response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ReminderResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Reminder response&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The ID of the reminder.&lt;br /&gt;
|-&lt;br /&gt;
| target_id || Number || The target_id where this reminder is attached to&lt;br /&gt;
|-&lt;br /&gt;
| alarm     || Time   || The time of the alarm&lt;br /&gt;
|-&lt;br /&gt;
| module    || Number || The module of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| servertime || Time || The time on the server&lt;br /&gt;
|-&lt;br /&gt;
| user_id || Number || The ID of the user.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || The last modification timestamp of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| recurrence_position || Number || The recurrence position for series appointments or 0 if no series&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || The ID of the folder through that the object can be read&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete a Reminder===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the id that was not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete Reminders (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the ids that were not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Remind again (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=remindAgain&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the reminder whose date shall be changed.&lt;br /&gt;
&lt;br /&gt;
Request body: The JSON representation of the reminder; mainly containing the field “alarm” which provides the new reminder date.&amp;lt;br&amp;gt;&lt;br /&gt;
E.g. &amp;lt;code&amp;gt;{ &amp;quot;alarm&amp;quot;: 1283418027381 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response body: The JSON representation of the updated reminder.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;multiple&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The multiple module allows to bundle multiple requests to most other modules in a single request. Not supported are:&lt;br /&gt;
* modules login and multiple,&lt;br /&gt;
* POST requests with a multipart encoding (uploads),&lt;br /&gt;
* GET requests which do not use an object as described in [[#ResponseBody | Response body]] as response body (downloads).&lt;br /&gt;
&lt;br /&gt;
=== Multiple requests ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/multiple&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;continue&amp;lt;/code&amp;gt; – Specifies whether processing of requests should stop when an error occurs, or whether all request should be processed regardless of errors.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with request objects. Each request object contains all URI parameters of the &amp;quot;normal&amp;quot; request as fields. The module name of the &amp;quot;normal&amp;quot; request is included in the field module. The parameter session is not included. If the &amp;quot;normal&amp;quot; request has a request body, the object which is represented by that request body is includes as the value of the field data.&lt;br /&gt;
&lt;br /&gt;
Response: An array with reply objects as described in [[#ResponseBody | Response body]]. The order of reply objects corresponds to the order of requests in the request body. Unlike with all other modules, this response is itself not part of a response object as described in [[#ResponseBody | Response body]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;quota&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The filestore module allows accesssing information about the use and quota of the filestore.&lt;br /&gt;
&lt;br /&gt;
=== Get quota information (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; (optional) – The module identifier to get quota information for, required if &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; is set.&lt;br /&gt;
* &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; (optional) – The account identifier within the module to get quota information for.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the requested quota information. If no &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was specified, all defined [[#ModuleQuota | module quotas]] are set in the JSON object, each one mapped to it's module identifier. If the quota from a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was requested, a JSON array containing all [[#AccountQuota | account quotas]] of this module are returned. If both a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; were requested, a JSON object representing this specific [[#AccountQuota | account auota]] is returned. &lt;br /&gt;
&lt;br /&gt;
Note: In case there is no quota limitation defined for a module or account, no corresponding JSON object is included in the response. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ModuleQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Module Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || The display name of the module&lt;br /&gt;
|-&lt;br /&gt;
| accounts|| Array || Each element identifies an account quota within the module, as described in [[#AccountQuota | Account Quota]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AccountQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Account Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| account_id || String || Identifier of the account&lt;br /&gt;
|-&lt;br /&gt;
| account_name || String || Name of the account&lt;br /&gt;
|-&lt;br /&gt;
| countquota || Number || The account's quota limit for the number of items, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| countuse || Number || The account's actual usage for the number of items, or not set if no count quota defined&lt;br /&gt;
|-&lt;br /&gt;
| quota || Number || The account's quota limit for the storage in bytes, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The account's actual usage for the storage in bytes, or not set if no storage quota defined&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get the filestore usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=filestore&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the uploaded files sizes sum and the field “quota” represents the maximum.&lt;br /&gt;
&lt;br /&gt;
=== Get the mail usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the use mail quota and the field “quota” represents the maximum. -1 represents an unlimited quota.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;import&amp;quot;==&lt;br /&gt;
The module import allows to import specific module data (like Contacts, Tasks or Appointments) in several formats (iCal, vCard, CSV) into a folder. Please note: The callback for all actions of this bundle is callback_import, not callback_$actionname for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
=== Import CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: A &amp;quot;multipart/form-data&amp;quot; encoded .CSV file. The field name for the file is &amp;quot;file&amp;quot;. The column titles of the table are those used within the OX, see column ''Displayed Name'' in [[#DetailedContactData]].&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import Outlook CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=OUTLOOK_CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: An .CSV file with Windows' default encoding Windows-1252. The column titles of the table may be those used by the English, French or German version of Outlook.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import iCAL ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This may be an Appointment or a Task folder. May even be a list containing both.&lt;br /&gt;
* &amp;lt;code&amp;gt;suppressNotification&amp;lt;/code&amp;gt; – This optional parameter can be used to disable the notifications for new appointments that are imported through the given iCal file. This help keeping the Inbox clean if a lot of appointments need to be imported. The value of this parameter does not matter because only for the existence of the parameter is checked.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignoreUIDs&amp;lt;/code&amp;gt; – Optional. When set to &amp;quot;true&amp;quot;, UIDs are partially ignored during import of tasks and appointments from iCal. Internally, each UID is replaced statically by a random one to preserve possibly existing relations between recurring appointments in the same iCal file, but at the same time to avoid collisions with already existing tasks and appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An iCalendar file.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered, and warnings (under the key &amp;quot;warnings&amp;quot;) containing an Array of objects with the warning data, containing all customary error fields.&lt;br /&gt;
&lt;br /&gt;
=== Import vCard ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An vCard file, maybe of the formats: vCard 2.1, vCard 3.0 or vCalendar 1.0&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;export&amp;quot; ==&lt;br /&gt;
The module export allows to export specific module data (like Contacts, Tasks or Appointments) from a folder in several formats (iCal, vCard, CSV).&lt;br /&gt;
&lt;br /&gt;
=== Exporting CSV ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – (optional) Columns to be imported from the given file, given as an array of column numbers. See [[#DetailedContactData | Detailed contact data]] for numbers.&lt;br /&gt;
* &amp;lt;code&amp;gt;export_dlists&amp;lt;/code&amp;gt; – (optional) toggles whether distribution lists are exported, too. Default is false. Option exists since 7.4.1.&lt;br /&gt;
Response: An InputStream containing the file of the MIME type &amp;lt;code&amp;gt;text/csv&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting iCAL ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Calendar folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/calendar&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting vCard ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/x-vcard&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;sync&amp;quot; ==&lt;br /&gt;
The module sync delivers several core API extensions to support common operations used in a mobile synchronization environment.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/sync?action=refresh_server&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;token&amp;quot; (since 7.4.0) ==&lt;br /&gt;
The module token delivers several core API extensions to support token based logins.&lt;br /&gt;
&lt;br /&gt;
=== Get a login token ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/token?action=acquireToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON object with the timestamp of the creation date and a token which can be used to create a new session.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mailfilter&amp;quot; ==&lt;br /&gt;
The module mailfilter describes how to add, update or delete mail filter rules or to check which actions are supported by the underlying system.&lt;br /&gt;
&lt;br /&gt;
A detailed description can be found here [[ HTTP_API_MailFilter | Mail Filter HTTP API]]&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;ajax file upload&amp;quot; ==&lt;br /&gt;
This module offers to store files in server's dedicated download directory for a configureable amount of time. The files are then accessible for further operations like inline images in (html) mails&lt;br /&gt;
&lt;br /&gt;
=== Uploading a file ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/file?action=new&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The module for which the file is uploaded to determine proper upload quota constraints (e.g. &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;, etc.).&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; – The file type filter to define which file types are allowed during upload. Currently supported filters are: &amp;lt;code&amp;gt;file=all, text=text/*, media=image OR audio OR video, image=image/*, audio=audio/*, video=video/*, application=application/*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A common POST request body of MIME type &amp;quot;multipart/*&amp;quot; which holds the file(s) to upload&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of the uploaded files. The files are accessible through the returned IDs for future use.&lt;br /&gt;
&lt;br /&gt;
=== Updating a file's last access timestamp (keep alive) ===&lt;br /&gt;
By updating the last access timestamp it's prevented from being deleted from both session and disk storage.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=keepalive&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file whose timestamp should be updated&lt;br /&gt;
&lt;br /&gt;
Response: The string &amp;quot;null&amp;quot; in response's data element&lt;br /&gt;
&lt;br /&gt;
=== Requesting a formerly uploaded file ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested file is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;image&amp;quot; ==&lt;br /&gt;
This module allows to download images from Open-Xchange server without providing a session ID in request's URL parameters.&lt;br /&gt;
&lt;br /&gt;
=== Requesting an image ===&lt;br /&gt;
Open-Xchange Server supports multiple image sources that are identified through request's path identifier&lt;br /&gt;
&lt;br /&gt;
* Inline images from mails&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mail/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Contact profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/contact/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* User profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/user/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* MP3 cover image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/file/mp3cover&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Fetch a previously uploaded image using &amp;lt;code&amp;gt;&amp;quot;/ajax/file&amp;quot;&amp;lt;/code&amp;gt; interface&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mfile/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each image source requires an individual set of required parameters&lt;br /&gt;
&lt;br /&gt;
==== Inline images from mails ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/mail/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;accountId&amp;lt;/code&amp;gt; – The mail account identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the mail resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The mail identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the image inside the referenced mail&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Contact profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/contact/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the contact resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The contact identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== User profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/user/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The user identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MP3 cover image ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/file/mp3cover&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Managed Image File ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/image/mfile/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;conversion&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
A generic module to request data from a data source and to process obtained/submitted data with a data handler. Thus data is converted from a data source by a data handler.&lt;br /&gt;
&lt;br /&gt;
=== Converting data ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
or&amp;lt;br&amp;gt;&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters: &amp;amp;lt;no parameters required&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A [[#ConversionRequest | conversion request]] JSON object containing nested JSON objects for [[#DataSource | data source]] and [[#DataHandler | data handler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConversionRequest&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Conversion request object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| datasource || JSON object || The data source object.&lt;br /&gt;
|-&lt;br /&gt;
| datahandler || JSON object || The data handler object.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSource&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data source object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data source.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data source&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataHandler&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data handler object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data handler.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data handler&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: The result of converted data ready as an appropriate JSON response&lt;br /&gt;
&lt;br /&gt;
==== Saving an ICal email attachment ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can be saved as appointments and tasks into given calendar and task folder.&lt;br /&gt;
If the fields &amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;quot; and &amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;quot; are set, the data handler inserts the appointment with the given status for the user, if the appointment does not exist. If it is already existing, the handler just updates the participant status.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;calendar-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.task.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;task-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;status&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;message&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added appointment/task; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Converting an ICal email attachment into JSON objects ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can converted to JSON appointments and tasks.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Note''' that all arguments are optional: Default is user time zone and zero recurrence position&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;com.openexchange.groupware.calendar.searchobject&amp;quot; triggers a search for the uid, and replaces the object_id and folder_id with the data of the corresponding ox-object id, if existing. The returned objects are still the ical objects and NOT the ox-objects.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical.json&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.timezone&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;timezone-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.recurrencePosition&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;recurrence-position&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.searchobject&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;true|false&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects for each appointment/task as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]/[[##DetailedAppointmentData | Detailed appointment data]]&lt;br /&gt;
&lt;br /&gt;
==== Saving a VCard email attachment ====&lt;br /&gt;
&lt;br /&gt;
If a VCard file is attached to an email, its content can be saved as contacts into given contact folder.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.contact.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;contact-folder-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added contact; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contact(s) attached to a new email as a VCard file ====&lt;br /&gt;
&lt;br /&gt;
Obtain VCard data from specified contact object(s).&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-id1&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;id1&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-idn&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;idn&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Get a new email's JSON object with specified VCard data source attached.&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:[]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A [[#DetailedMailData | mail]] JSON object.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:{search-term-object}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&amp;lt;br&amp;gt;&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[...]}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moreover there are two different types of a search terms:&lt;br /&gt;
* A single search term&lt;br /&gt;
* A composite search term&lt;br /&gt;
&lt;br /&gt;
A single search term reflects an operation which cannot hold nested search terms as operands; e.g. &amp;quot;equals&amp;quot;. In opposite to this a composite search term holds one or more nested search terms as operands; e.g. &amp;quot;not&amp;quot; or the logical junctors &amp;quot;and&amp;quot;/&amp;quot;or&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
By now the following operations are supported:&lt;br /&gt;
* composite operations&lt;br /&gt;
** &amp;quot;and&amp;quot; - The AND junctor&lt;br /&gt;
** &amp;quot;or&amp;quot; - The OR junctor&lt;br /&gt;
** &amp;quot;not&amp;quot; - Negation&lt;br /&gt;
* single operations&lt;br /&gt;
** &amp;quot;equals&amp;quot; - Equals comparison&lt;br /&gt;
** &amp;quot;lt&amp;quot; - Less-than comparison&lt;br /&gt;
** &amp;quot;gt&amp;quot; - Greater-than comparison&lt;br /&gt;
&lt;br /&gt;
Furthermore following operand types are supported for single search terms:&lt;br /&gt;
* Column - Providing a name referring to a field/column&lt;br /&gt;
* Constant - A constant&lt;br /&gt;
&lt;br /&gt;
Example of an EQUALS search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of an OR search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;or&amp;quot;,&amp;quot;operands&amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;gt&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;birthday&amp;quot;},&amp;quot;1975-05-01&amp;quot;]}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Refer to object data tables introduced by different modules to know which field names are supported; e.g. for tasks it is [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]], and [[#DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (alternative suggestion, still preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:&amp;lt;i&amp;gt;[search term]&amp;lt;/i&amp;gt;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[&amp;quot;&amp;gt;&amp;quot;, 5, 2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The available operators are:&lt;br /&gt;
* Comparison operators &amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;=&amp;quot;, &amp;quot;&amp;lt;=&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
* logic operators &amp;quot;not&amp;quot;, &amp;quot;and&amp;quot;, &amp;quot;or&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Comparison operators have exactly two operands. Each operand can be either a field name or a constant. A field name is an object with the member &amp;quot;field&amp;quot; specifying the field name, e.g. &amp;lt;code&amp;gt;{ field: &amp;quot;first_name&amp;quot; }&amp;lt;/code&amp;gt;. The available field names depend on the searched module. Primitive JSON types are interpreted as constants. Arrays are not valid operands for comparison operators.&lt;br /&gt;
&lt;br /&gt;
The logic operator &amp;quot;not&amp;quot; has exactly one operand, the other logic operators can have any number of operands. Each operand must be an array representing a nested search expression.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail account&amp;quot; (available with v6.12) ==&lt;br /&gt;
&lt;br /&gt;
The mail account module is used to manage multiple mail accounts held by a user.&lt;br /&gt;
&lt;br /&gt;
=== Get All mail accounts  ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mail account's are defined in [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one mail account and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail account ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the account to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the desired mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MailAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Mail account data&lt;br /&gt;
! ID    !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  1001   || id            || Number  || Account ID&lt;br /&gt;
|-&lt;br /&gt;
|  1002   ||  login    || String  || The login.&lt;br /&gt;
|-&lt;br /&gt;
|  1003   ||  password   || String  || The (optional) password.&lt;br /&gt;
|-&lt;br /&gt;
|  1004   ||  mail_url || String    || The mail server URL; e.g. &amp;quot;imap://imap.somewhere.com:143&amp;quot;. '''URL is preferred over single fields''' (like mail_server, mail_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|  1005   ||  transport_url || String    || The transport server URL; e.g. &amp;quot;smtp://smtp.somewhere.com:25&amp;quot;. '''URL is preferred over single fields''' (like transport_server, transport_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|   1006  ||  name || String    || Account's display name.&lt;br /&gt;
|-&lt;br /&gt;
|  1007   ||  primary_address || String    || User's primary address in account; e.g. &amp;quot;someone@somewhere.com&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|  1008   ||  spam_handler || String    || The name of the spam handler used by account.&lt;br /&gt;
|-&lt;br /&gt;
|   1009  ||  trash || String    || The name of the default trash folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1010   ||  sent || String    || The name of the default sent folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1011  ||  drafts || String    || The name of the default drafts folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1012   ||  spam || String    || The name of the default spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1013   ||  confirmed_spam || String    || The name of the default confirmed-spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1014  || confirmed_ham || String    || The name of the default confirmed-ham folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1015  ||  mail_server || String    || The mail server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1016  ||  mail_port || Number    || The mail server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1017  ||  mail_protocol || String    || The mail server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;imap&amp;quot; instead of &amp;quot;imaps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1018  ||  mail_secure || Boolean    || Whether to establish a secure connection to mail server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1019  ||  transport_server || String    || The transport server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1020  ||  transport_port || Number    || The transport server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1021  ||  transport_protocol || String    || The transport server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;smtp&amp;quot; instead of &amp;quot;smtps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1022  ||  transport_secure || Boolean    || Whether to establish a secure connection to transport server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1023  ||  transport_login || String    || The transport login. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1024  ||  transport_password || String    || The transport password. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1025  ||  unified_inbox_enabled || Boolean    || If enabled for Unified INBOX&lt;br /&gt;
|-&lt;br /&gt;
|   1026  ||  trash_fullname || String    || Path to default trash folder. Preferred over &amp;quot;trash&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1027  ||  sent_fullname || String    || Path to default sent folder. Preferred over &amp;quot;sent&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1028  ||  drafts_fullname || String    || Path to default drafts folder. Preferred over &amp;quot;drafts&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1029  ||  spam_fullname || String    || Path to default spam folder. Preferred over &amp;quot;spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1030  ||  confirmed_spam_fullname || String    || Path to default confirmed-spam folder. Preferred over &amp;quot;confirmed_spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1031  ||  confirmed_ham_fullname || String    || Path to default confirmed-ham folder. Preferred over &amp;quot;confirmed_ham&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1032  ||  pop3_refresh_rate || Number    || The interval in minutes the POP3 account is refreshed&lt;br /&gt;
|-&lt;br /&gt;
|   1033  ||  pop3_expunge_on_quit || Boolean    || Whether POP3 messages shall be deleted on actual POP3 account after retrieval or not&lt;br /&gt;
|-&lt;br /&gt;
|   1034  ||  pop3_delete_write_through || Boolean    || If option &amp;quot;pop3_expunge_on_quit&amp;quot; is disabled, this property defines whether a delete in local INBOX also deletes affected message in actual POP3 account&lt;br /&gt;
|-&lt;br /&gt;
|   1035  ||  pop3_storage || String    || The name of POP3 storage provider, default is &amp;quot;mailaccount&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1036  ||  pop3_path || String    || Path to POP3's virtual root folder in storage, default is name of the POP3 account beside default folders&lt;br /&gt;
|-&lt;br /&gt;
|   1037  ||  personal || String    || The customizable personal part of email address&lt;br /&gt;
|-&lt;br /&gt;
|   1038  ||  reply_to || String    || The customizable reply-to email address&lt;br /&gt;
|-&lt;br /&gt;
|   1039  ||  addresses || String    || The comma-separated list of available E-Mail addresses including aliases. !! Only available for primary mail account !!&lt;br /&gt;
|-&lt;br /&gt;
|   1040  ||  meta || JSON data    || Stores arbitrary JSON data as specified by client associated with the mail account&lt;br /&gt;
|-&lt;br /&gt;
|   1041  ||  archive || String    || The name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1042  ||  archive_fullname || String    || The full name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1043  ||  transport_auth || String    || '''Available since v7.6.1''' Specifies the source for mail transport (SMTP) credentials. Possible values: &amp;quot;mail&amp;quot;, &amp;quot;custom&amp;quot;, and &amp;quot;none&amp;quot;.&amp;lt;br&amp;gt;- &amp;quot;mail&amp;quot; signals to use the same credentials as given in associated mail store (IMAP, POP3).&amp;lt;br&amp;gt;- &amp;quot;custom&amp;quot; signals that individual credentials are supposed to be used (fields &amp;quot;transport_login&amp;quot; and &amp;quot;transport_password&amp;quot; are considered).&amp;lt;br&amp;gt;- &amp;quot;none&amp;quot; means the mail transport does not support any authentication mechanism (rare case!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a new mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to create. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the inserted mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object identifiying (field ID is present) and describing the account to update. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the updated mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ID of the mail account to delete.&lt;br /&gt;
&lt;br /&gt;
=== Validate a mail account (which shall be created) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=validate&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; - An optional boolean parameter which indicates whether on successful validation the folder tree shall be returned (NULL on failure) or if set to &amp;quot;false&amp;quot; or missing only a boolean is returned which indicates validation result&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to validate. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: Dependent on optional &amp;quot;tree&amp;quot; parameter a JSON folder object or a boolean value indicating the validation result&lt;br /&gt;
&lt;br /&gt;
The JSON folder object corresponding to [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
Additionally a field &amp;quot;subfolder_array&amp;quot; is added which contains possible subfolders. This field is missing if a folder contains no subfolders.&lt;br /&gt;
&lt;br /&gt;
[[Category: OX6]]&lt;br /&gt;
&lt;br /&gt;
== Module Auto Configuration (since 6.22) ==&lt;br /&gt;
&lt;br /&gt;
=== Get Auto Configuration ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/autoconfig?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
application/x-www-form-urlencoded parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; – Email Adress for which a mail configuration will be discovered.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – Corresponding password for the mail account (optional)&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the best available settings for an appropriate mail Server for the given email address. The fields are described in [[#MailAccountData | mail account data]]. The Data may be incomplete or even empty.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user&amp;quot; (available with v6.14) ==&lt;br /&gt;
&lt;br /&gt;
The user module is used to access user information.&lt;br /&gt;
&lt;br /&gt;
=== Get all users ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedUserData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed user data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type       !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 610 || Aliases                     || aliases              || Array      || The user's aliases&lt;br /&gt;
|-&lt;br /&gt;
| 611 || Time zone                   || timezone             || String     || The time zone ID.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || Locale                      || locale               || String     || The name of user's entire locale, with the language, country and variant separated by underbars. E.g. &amp;quot;en&amp;quot;, &amp;quot;de_DE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 613 || Groups                      || groups               || Array      || The IDs of user's groups&lt;br /&gt;
|-&lt;br /&gt;
| 614 || Contact ID                  || contact_id           || Number     || The contact ID of the user&lt;br /&gt;
|-&lt;br /&gt;
| 615 || Login info                  || login_info           || String     || The user's login information&lt;br /&gt;
|-&lt;br /&gt;
| 616 || Guest Created By            || guest_created_by     || Number     || The ID of the user who has created this guest in case this user represents a guest user; it is 0 for regular users (preliminary, available with v7.8.0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of numbers. Each number is the ID of requested user. Since v6.18.1, a &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; value in the array is interpreted as the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a user ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested user. Since v6.18.1, this parameter is optional: the default is the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested user. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a user ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated user.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated user. If the user was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: User object as described in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
'''Note''': &amp;quot;timezone&amp;quot; and &amp;quot;locale&amp;quot; are the only fields from [[#DetailedUserData | Detailed user data]] which are allowed to be updated.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty object.&lt;br /&gt;
&lt;br /&gt;
=== Search users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected users with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchUsers | Search users]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsers&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find users. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search users with the given startletter. If this field is present, the pattern is matched against the user field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchUsersAlternative | Search users alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsersAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches users where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches users where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches users where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, the fields are connected through an OR search habit.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed by connecting the relevant fields through an OR search habit.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=getAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The attribute name. &lt;br /&gt;
&lt;br /&gt;
Response without timestamp: A JSON object providing name and value of the requested attribute&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=setAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;setIfAbsent&amp;lt;/code&amp;gt; - Set to &amp;quot;true&amp;quot; to put the value only if the specified name is not already associated with a value, otherwise &amp;quot;false&amp;quot; to put value in any case&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing name and value of the attribute. If the &amp;lt;code&amp;gt;&amp;quot;value&amp;quot;&amp;lt;/code&amp;gt; field id missing or NULL, the attribute is removed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if PUT was successful; otherwise &amp;quot;false&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user/me&amp;quot; (available with v7.6.2) ==&lt;br /&gt;
&lt;br /&gt;
The user/me module is used to access formal information about current user.&lt;br /&gt;
&lt;br /&gt;
=== Get user information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user/me&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object providing information for current user&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;context_id&amp;quot;: 1234,&lt;br /&gt;
        &amp;quot;user_id&amp;quot;: 5,&lt;br /&gt;
        &amp;quot;is_context_admin&amp;quot;: false,&lt;br /&gt;
        &amp;quot;login_name&amp;quot;: &amp;quot;user5&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;: &amp;quot;User Five&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: 1400855683800&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;OAuth&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Open-Xchange server can act as an OAuth client (starting with v6.20) or be an OAuth provider itself (starting with v7.8.0). The OAuth module supports both aspects:&lt;br /&gt;
&lt;br /&gt;
* Manage multiple OAuth accounts for certain online services for a user. The OAuth mechanism allows the Open-Xchange application to act as behalf of this user using previously obtained access tokens granted by user. The according interface is divided into two parts: Account access and service's meta data access.&lt;br /&gt;
* Manage granted accesses of external services that can access a users data on his behalf, called &amp;quot;grants&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== OAuth account access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service account access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth accounts ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The &amp;lt;b&amp;gt;optional&amp;lt;/b&amp;gt; service meta data identifier. If missing all accounts of all services are returned; otherwise all accounts of specified service are returned&lt;br /&gt;
&lt;br /&gt;
Response: An array with account data. Each array element is a JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
| serviceId     || String   || The identifier of the associated service meta data; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| secret || String || The token secret&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Delete an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Update an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier. May also be provided in request body's JSON OAuth account representation by &amp;lt;code&amp;gt;&amp;quot;id&amp;quot;&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the OAuth account fields to update. See [[#OauthAccountData | OAuth account data]]. Currently the only values which make sende being updated are &amp;lt;code&amp;gt;&amp;quot;displayName&amp;quot;&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;&amp;quot;token&amp;quot;&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;&amp;quot;secret&amp;quot;&amp;lt;/code&amp;gt;-pair.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Initialize creation of an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=init&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The service meta data identifier; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An JSON representation of the resulting interaction providing needed information to complete account creation. See [[#OauthInteractionData | OAuth interaction data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OauthInteractionData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth interaction&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| authUrl || String || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The interaction type name; &amp;lt;code&amp;gt;&amp;quot;outOfBand&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;callback&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| uuid || String || The UUID for this OAuth interaction&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Create an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
Note: This action is typically called by provided call-back URL and is ony intended for manual invocation if &amp;quot;outOfBand&amp;quot; interaction is returned by preceeding &amp;lt;code&amp;gt;/ajax/oauth/account?action=init&amp;lt;/code&amp;gt; step.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=create&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_token&amp;lt;/code&amp;gt; – The request token from preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; – The UUID of the preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_verfifier&amp;lt;/code&amp;gt; – The verifier string which confirms that user granted access&lt;br /&gt;
* &amp;lt;code&amp;gt;displayName&amp;lt;/code&amp;gt; – The display name for the new account&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing the newly created OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
=== OAuth service meta data access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service meta data access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth services' meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array with service data. Each array element is a JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth service's meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The service's identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthServiceMetaData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth service meta data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Manage OAuth grants (available with v7.8.0) ===&lt;br /&gt;
&lt;br /&gt;
==== Get all grants ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/grants?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing one object for every granted access as specified in [[#OAuthGrants | OAuth grants]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthGrants&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth grants&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| client || Object || A JSON object describing the external service as in [[#OAuthClient | OAuth client]].&lt;br /&gt;
|-&lt;br /&gt;
| scopes || Object || A JSON object with mappings from scope tokens to translated, human-readable descriptions for every scope that was granted to the external service. Example: {&amp;quot;read_contacts&amp;quot;:&amp;quot;See all your contacts.&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| date || Time || The time when the access was granted.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthClient&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth client&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The clients ID.&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The clients/services name.&lt;br /&gt;
|-&lt;br /&gt;
| description || String || A description of the client.&lt;br /&gt;
|-&lt;br /&gt;
| website || String || A URL to the clients website.&lt;br /&gt;
|-&lt;br /&gt;
| icon || String || A URL or path to obtain the clients icon via the &amp;quot;image&amp;quot; module.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Revoke access ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;oauth/grants?action=revoke&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - The ID of the client whose access shall be revoked.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;JSlob&amp;quot; (available with v6.22) ==&lt;br /&gt;
&lt;br /&gt;
The JSlob module is used to store&amp;amp;retrieve arbitrary JSON-structured configuration for a single user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all JSLobs ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jslob?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;JSlobData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | JSlob data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String or Number || The identifier of the JSlob.&lt;br /&gt;
|-&lt;br /&gt;
| jslob || JSON object || The JSON configuration.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== List denoted JSLobs ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array of JSlob identifiers; e.g. &amp;lt;code&amp;gt;[ &amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, … ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== Delete a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The JSlob identifier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An empty request body&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Store a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the &amp;quot;path&amp;quot; and &amp;quot;value&amp;quot; of the JSON configuration to store. If &amp;quot;path&amp;quot; is missing the current configuration&lt;br /&gt;
is merged with given JSON object.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Update a single value inside a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: The new value to store inside specified JSlob&lt;br /&gt;
&lt;br /&gt;
Response: A JSlob representation according to [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== REST-like access to JSlob module ===&lt;br /&gt;
&lt;br /&gt;
to be done...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;freebusy&amp;quot; (available with v6.22.1) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to free/busy information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get free/busy information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/freebusy?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;participant&amp;lt;/code&amp;gt; – The participant to get the free/busy data for. May be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Response: An array of free/busy intervals as described in [[#FreeBusyInterval | Free/Busy interval]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FreeBusyInterval&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Free/Busy interval&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| start_date  || Time       || Start time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| end_date    || Time       || End time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number     || The busy status of this interval, one of:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| id          || String     || Object ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id   || String     || Folder ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| title       || String     || Title of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| location    || String     || Location of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean    || True if the corresponding appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a list of free/busy information ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/freebusy?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of participants to get the free/busy data for. Each participant may be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
&lt;br /&gt;
Response: The free/busy data for all requested participants inside a JSON object with the participants as keys. Besides a combined data element for a requested group, all group members are resolved and listed seperately in the result. If the 'merged' view was requested, an additional data element named 'merged' representing a combined view for all requested participants is added to the results implicitly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Services ==&lt;br /&gt;
&lt;br /&gt;
Messaging Services represent a messaging backend. The messaging services add a new folder module &amp;quot;messaging&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
A *Messaging Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a messagingService. Usually a String in reverse domain name notation. Example: &amp;quot;com.openexchange.messaging.twitter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Twitter&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| formDescription || Array      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
| messagingActions || Array     || An array of Strings a dynamic set of actions that are possible with messages of this service. Described in detail later on. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of messaging service objects. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the messaging service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a messaging service object.&lt;br /&gt;
&lt;br /&gt;
== Messaging Accounts ==&lt;br /&gt;
&lt;br /&gt;
A messaging account represents the concrete configuration of an account of a given messaging service.&lt;br /&gt;
A *messaging account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number      || Identifies a given messaging account. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| messagingService || String  || The messaging service id of the messaging service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant messagingService &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;messagingService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* messagingService - (optional) list only those accounts that belong to the given messagingService.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Messages ==&lt;br /&gt;
&lt;br /&gt;
A Messaging Message represents a single message. It consists of some metadata, headers and a content. The content attribute varies by the content-type header. &lt;br /&gt;
If the content type is text/* it is a string, if it is a multipart/* it is an array of objects, each representing a part of the multipart. If it is anything else&lt;br /&gt;
it is considered binary and is a Base64 encoded string (ToDo : This is not smart enough yet. I suppose we'll have to include encoding options for binaries much like in our EAVJSONProposal).&lt;br /&gt;
&lt;br /&gt;
The folder id of a message follows a predefined format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[messagingService]://[accountId]/[path]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for an imaginary example consider: &amp;quot;com.openexchange.messaging.twitter://535/defaultTimeline/directMessages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The structure of a Messaging Message is as follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Message&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|id            ||String       || The id of this message. Only unique in the given folder. &lt;br /&gt;
|-&lt;br /&gt;
|folder        ||String       || The folder id. &lt;br /&gt;
|-&lt;br /&gt;
|threadLevel   ||Number       || The nesting level of this message according to the conversation it's belonged to. May not be set. &lt;br /&gt;
|-&lt;br /&gt;
|flags         ||Number       || Bitmask showing the state of this message. The same as in the module &amp;quot;mail&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|receivedDate  ||Time         || The time this message was received. &lt;br /&gt;
|-&lt;br /&gt;
|colorLabel    ||Number       || An arbitrary number marking this message in a certain color. The same as the colorLabel common to all groupware objects (see HTTP API)&lt;br /&gt;
|-&lt;br /&gt;
|user          ||Array        || An array of strings. Represents user flags. &lt;br /&gt;
|-&lt;br /&gt;
|size          ||Number       || The binary size of this message in bytes. &lt;br /&gt;
|-&lt;br /&gt;
|picture    || String       || A string depicting the URL to a picture for this message &lt;br /&gt;
|-&lt;br /&gt;
|url           || String      || A string that contains a link to the messages origin. Currently used in RSS messages.&lt;br /&gt;
|-&lt;br /&gt;
|headers       ||JSONObject   || A JSON Object of header data. Usually the value is either a String or an Array (if the headers has more than one value). Certain headers are rendered as more complex structures, see the section &amp;quot;Complex Headers&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|content       ||String or Array || See introductory note for Messaging Messages. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The structure of a Multipart Part (an element of the content array in a multipart/* message) is a s follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Multipart Element&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|sectionId     || String       || The sectionId of this part.&lt;br /&gt;
|-&lt;br /&gt;
|headers       || JSONObject   || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|content       || String or Array || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some *Complex Headers* have a structure differing from simple key/value(s) pairs. These are:&lt;br /&gt;
&lt;br /&gt;
=== Content-Type ===&lt;br /&gt;
&lt;br /&gt;
The Content-Type header is represented as a JSON Object with the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Content Type Header&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| type         || String          || The type string (eg. text/plain). This governs the rendering of the content of a message. &lt;br /&gt;
|-&lt;br /&gt;
| params       || Object          || An Object with the keys &amp;quot;charset&amp;quot;, containing the charset of this message and &amp;quot;name&amp;quot; pointing to the filename this part or message should have. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting the content-type header in a messaging messages generated on the client the header may also be sent in it's short form. The short form is the type followed by a semi-colon separated list of key=value pairs&lt;br /&gt;
of the params. For example: &amp;quot;text/plain;charset=utf-8;name=something.txt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Address Headers ===&lt;br /&gt;
&lt;br /&gt;
Address headers ( From, To,Cc,Bcc,Reply-To,Resent-Reply-To,Disposition-Notification-To,Resent-To,Sender,Resent-Sender,Resent-To,Resent-Cc,Resent-Bcc ) are formatted as an array of objects, or in case of &amp;quot;From&amp;quot; as a single object, with the attributes *address* and *personal*:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Address Headers&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| address         || String     || The technical part of the address&lt;br /&gt;
|-&lt;br /&gt;
| personal       || String      || A displayable description of the addressee. May be unset.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting an address header the header may also be sent by clients in the short form &amp;lt;code&amp;gt;&amp;quot;personal &amp;amp;lt;address&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;&amp;quot;Clark Kent &amp;amp;lt;clark.kent@dailyplanet.com&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== List renderings of Messaging Messages ===&lt;br /&gt;
&lt;br /&gt;
Actions returning lists of messages usually return only a selection of attributes of a message driven by a &amp;quot;columns&amp;quot; parameter. The columns that are addressable point either to attributes of the top-level message or its headers. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Header Equivalence&lt;br /&gt;
! Column     !! Refers To&lt;br /&gt;
|-&lt;br /&gt;
|   *column*    |     *refers to*     &lt;br /&gt;
|-&lt;br /&gt;
| id            || The id attribute    &lt;br /&gt;
|-&lt;br /&gt;
| folderId      || The folder attribute &lt;br /&gt;
|-&lt;br /&gt;
| contentType   || The &amp;quot;Content-Type&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| from          || The &amp;quot;From&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| to            || The &amp;quot;To&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| cc            || The &amp;quot;Cc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| bcc           || The &amp;quot;Bcc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| subject       || The &amp;quot;Subject&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| size          || The size attribute &lt;br /&gt;
|-&lt;br /&gt;
| sentDate      || The &amp;quot;Date&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| receivedDate  || The receivedDate attribute &lt;br /&gt;
|-&lt;br /&gt;
| flags         || The flags attribute &lt;br /&gt;
|-&lt;br /&gt;
| threadLevel   || The threadLevel attribute &lt;br /&gt;
|-&lt;br /&gt;
| dispositionNotificationTo || The &amp;quot;Disposition-Notification-To&amp;quot; header. &lt;br /&gt;
|-&lt;br /&gt;
| priority      || The &amp;quot;X-Priority&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| colorLabel    || The colorLabel attribute &lt;br /&gt;
|-&lt;br /&gt;
| url             || The url attribute &lt;br /&gt;
|-&lt;br /&gt;
| body          || The content attribute &lt;br /&gt;
|-&lt;br /&gt;
| headers       || The headers attribute &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== JSON calls ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* id - The ID of the message to load&lt;br /&gt;
* peek - (optional) if set to &amp;quot;true&amp;quot; the read/unread state of the message will not change. Defaults to false.&lt;br /&gt;
* folder - The folder id&lt;br /&gt;
   &lt;br /&gt;
Response: An Object representing the loaded message.&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/message?action=send&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* recipients - (optional) If set the message is sent to the given list of recipients, otherwise this defaults to the &amp;quot;To&amp;quot; header of the message.&lt;br /&gt;
   &lt;br /&gt;
Request Body: The Request Body should contain the JSON Object representing the message to be sent.&lt;br /&gt;
Response: &amp;quot;1&amp;quot; as the data of a regular response on success.&lt;br /&gt;
&lt;br /&gt;
GET or PUT /ajax/messaging/message?action=perform&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* action - The messaging action to invoke&lt;br /&gt;
* id - The id of the message the action should be invoked on. Only used on actions of type &amp;quot;storage&amp;quot;.&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
   &lt;br /&gt;
Request Body: On actions of type &amp;quot;message&amp;quot; the body should contain the JSON representation of the message the action should be applied to.&lt;br /&gt;
Response: Either 1 if no further user interaction is needed or a messaging message that, after having the user modify it has to be supplied back to the follower action of this action.&lt;br /&gt;
&lt;br /&gt;
Thus, to invoke a messaging action of type &amp;quot;storage&amp;quot; the folder and id are needed. Messaging actions of type &amp;quot;message&amp;quot; need a folder and message in the body. &lt;br /&gt;
Messaging actions of type &amp;quot;none&amp;quot; need a messaging message and account. &lt;br /&gt;
&lt;br /&gt;
==== List style requests ====&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
* sort - (optional) A column to sort by.&lt;br /&gt;
* order - (optional) The order direction. &amp;quot;asc&amp;quot; for ascending or &amp;quot;desc&amp;quot; for descending. Defaults to &amp;quot;asc&amp;quot;&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the the columns parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/messages?action=list&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
&lt;br /&gt;
Request Body: An array of arrays with the folder and id as elements each identifying a message. &lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Snippet module (available with v7.0.0/v6.22.0) ==&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=get&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The snippet's JSON representation; e.g.&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;signature&amp;quot;,&lt;br /&gt;
    &amp;quot;props&amp;quot;: {&amp;quot;x-custom&amp;quot;: &amp;quot;any value&amp;quot;},&lt;br /&gt;
    &amp;quot;module&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;displayname&amp;quot;: &amp;quot;My signature&amp;quot;,&lt;br /&gt;
    &amp;quot;misc&amp;quot;: {&amp;quot;foo&amp;quot;: &amp;quot;bar&amp;quot;},&lt;br /&gt;
    &amp;quot;createdby&amp;quot;: 17,&lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;-- \\nMy name and position here&amp;quot;,&lt;br /&gt;
    &amp;quot;accountid&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;shared&amp;quot;: false,&lt;br /&gt;
    &amp;quot;files&amp;quot;:&lt;br /&gt;
    [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;mimetype&amp;quot;: &amp;quot;image/png; name=pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;filename&amp;quot;: &amp;quot;pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;46f49f8a-40d5-4f29-8bc9-728f3420864c&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 6074&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Gets all snippets associated with the current user and context ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=all&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* type		- Optional CSV of types to filter by; e.g. &amp;quot;signature&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets certain snippets by identifiers ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=list&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of snippet identifiers&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet's attachment by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=getattachment&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
* attachmentid	- The attachment identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The attachment's raw data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Creates a new snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=new&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The created snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Updates a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=update&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet providing the fields that should be changed.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's JSON representation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Deletes a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=delete&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier (otherwise provide one or more identifiers through request body's JSON array)&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of identifiers denoting the snippets to delete&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
An empty/dummy result (don't care)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Attaches one or more files to an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
POST /ajax/snippet?action=attach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
Multipart form data providing the upload files to attach to the snippet.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Detaches open or more files from an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=detach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array providing the identifiers of the attachments to remove from snippet&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
== Module Halo ==&lt;br /&gt;
&lt;br /&gt;
=== Investigate contact ===&lt;br /&gt;
&lt;br /&gt;
PUT /appsuite/api/halo/contact?action=investigate&lt;br /&gt;
&lt;br /&gt;
The investigate action provides access to different halo providers. &lt;br /&gt;
Each provider requires an own set of parameters and also provides different results. &lt;br /&gt;
The following section describes some but not necessarily all of this providers.&lt;br /&gt;
Each request contains the following common parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; - The provider to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; - (optional) The timezone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to this parameters a contact must be defined. This can be done either with at least one of the following parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or within the request body.&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
&lt;br /&gt;
Instead of the contact parameters one can send a JSON object within the body of the request. This body describes the contact.&lt;br /&gt;
If used, it must contain at least one of the fields shown below. If the requests contains a body, the contact specific parameters are ignored. &lt;br /&gt;
It is also possible to provide more contact information. Empty fields are filled up with this values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSON object:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
	&amp;quot;contact_id&amp;quot;:12345&lt;br /&gt;
	&amp;quot;internal_userid&amp;quot;:12345&lt;br /&gt;
	&amp;quot;email1&amp;quot;: mail1@domain.com&lt;br /&gt;
	&amp;quot;email2&amp;quot;: mail2@domain2.com&lt;br /&gt;
	&amp;quot;email3&amp;quot;: mail3@domain3.com&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
The request responds with a JSON object. The content and structure of this object depends on the chosen provider. &lt;br /&gt;
In each case the response contains only data known to the server. Therefore some or all fields may be null.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.contacts &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
&lt;br /&gt;
A JSON array with the contact informations specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.appointments &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Requests parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - The start point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; - The end point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
	&lt;br /&gt;
A JSON array of appointments. Each appointment contains the fields specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.mail &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - The maximum number of mails within the result.&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
	&lt;br /&gt;
A JSON array of mails. Each mail contains the fields specified by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get halo services ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact?action=services&lt;br /&gt;
&lt;br /&gt;
Request parameter: &lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
 &lt;br /&gt;
A JSON object with a &amp;quot;data&amp;quot; field which contains an array of all available halo providers.&lt;br /&gt;
&lt;br /&gt;
=== Get contact picture ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact/picture&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - (optional) falls back to the public session cookie&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt; - (optional)  The internal user id of a user whose picture you want to load&lt;br /&gt;
* &amp;lt;code&amp;gt;userid&amp;lt;/code&amp;gt; - (optional) an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;user_id&amp;lt;/code&amp;gt; - (optional)  an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - (optional) a contact id&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; - (optional) an email to search for. Will pick global address book matches before regular matches. After that picks the most recently changed contact&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt; - (optional)  an alias for email&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt; - (optional) another email address to use to find matches&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt; - (optional) and yet another email address to use to find matches&lt;br /&gt;
&lt;br /&gt;
''At least one of the optional search parameters should be set. All parameters are connected by OR during the search. More specific parameters like user_id or id are prioritized in case of multiple matches.''&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The picture with proper eTag and caching headers set, or an HTTP Status 404 response, if no picture could be found.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;capabilities&amp;quot; (available with v7.4.2) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to capabilities, i.e. modules or features that are available on the backend and the user has access to.&lt;br /&gt;
&lt;br /&gt;
=== Get a capability ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the capability&lt;br /&gt;
&lt;br /&gt;
Response: The requested capability as described in [[#Capability| Capability]], if available, otherwise an empty result&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capability&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capability&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id  || String       || The identifier of the capability&lt;br /&gt;
|-&lt;br /&gt;
| attributes    || Object       || A JSON object holding optional properties of the capability &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all capabilities ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of capability objects as described in [[#Capability| Capability]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;jump&amp;quot; (available with v7.6.0) ==&lt;br /&gt;
&lt;br /&gt;
The jump module is used to pass an acquired identity token for an authenticated user from one system to another for a single sign-on.&lt;br /&gt;
&lt;br /&gt;
=== Acquire an identity token ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jump?action=identityToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; – The identifier for the external service/system&lt;br /&gt;
&lt;br /&gt;
Response: The acquired identity token wrapped by a simple JSON object as described in [[#Jump| Jump]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Jump&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Jump&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| token  || String       || The identifier of the token&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;find&amp;quot; (preliminary, available with v7.6.1) ==&lt;br /&gt;
The Find API consists of calls for performing searches within the modules mail, contacts, calendar, tasks and drive. It was designed to provide an iterative approach where the search criteria can be refined step-wise until the desired items are found. The starting point is always an &amp;quot;autocomplete&amp;quot; request, that suggests possible search filters based on a users input. Those filters are grouped into categories, called &amp;quot;facets&amp;quot;. A facet may provide one or more &amp;quot;values&amp;quot; with every value being a possible filter. A client is meant to remember every value that was selected by a user and include it within the following &amp;quot;autocomplete&amp;quot; and &amp;quot;query&amp;quot; requests, while &amp;quot;query&amp;quot; performs the actual search and returns the found items.&lt;br /&gt;
&lt;br /&gt;
Every request is bound to a module that must be specified via the URL-Parameter &amp;quot;module&amp;quot;. Possible modules are&lt;br /&gt;
* mail&lt;br /&gt;
* contacts&lt;br /&gt;
* calendar&lt;br /&gt;
* tasks&lt;br /&gt;
* drive&lt;br /&gt;
&lt;br /&gt;
=== General assumptions ===&lt;br /&gt;
Some of the objects returned by the server contain former user input. A client must never interpret  strings as HTML but always as plain text to be not vulnerable for CSS attacks!&lt;br /&gt;
&lt;br /&gt;
=== Calls ===&lt;br /&gt;
The find API provides two dedicated calls under the servlet path &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* action=query&lt;br /&gt;
&lt;br /&gt;
=== Facets ===&lt;br /&gt;
The style of a facet is responsible for how the according object is structured, how it is handled on the server-side and how the client has to handle it.&lt;br /&gt;
We distinguish three styles of facets:&lt;br /&gt;
* simple&lt;br /&gt;
* default&lt;br /&gt;
* exclusive&lt;br /&gt;
&lt;br /&gt;
Every facet value contains an embedded &amp;quot;filter&amp;quot; object. The filter must not be changed by the client, it has to be seen as a black-box. Instead the filters&lt;br /&gt;
of selected facet values have to be copied and sent to the server with the subsequent requests.&lt;br /&gt;
&lt;br /&gt;
==== Simple Facets ====&lt;br /&gt;
A simple facet is a special facet that has exactly one value. The facets&lt;br /&gt;
type and its value are strictly coupled, in a way that a display name for both,&lt;br /&gt;
facet and value would be redundant. A simple facet generally denotes a logical field like&lt;br /&gt;
'phone number'. Internally this logical field can map to several internal fields&lt;br /&gt;
(e.g. 'phone_private', 'phone_mobile', 'phone_business'). In clients the facet as&lt;br /&gt;
a whole can be displayed as a single item. Example: &amp;quot;Search for 'term' in field 'phone&lt;br /&gt;
number'&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;simple&amp;quot; || Denotes that this is a facet of style simple&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
    &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Default Facets ====&lt;br /&gt;
A default facet contains multiple values and may be present&lt;br /&gt;
multiple times in search requests to filter results by a combination of different&lt;br /&gt;
values (e.g. &amp;quot;mails with 'foo' and 'bar' in subject&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;default&amp;quot; || Denotes that this is a facet of style default&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| values || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
    &amp;quot;values&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
        &amp;quot;item&amp;quot;:{&lt;br /&gt;
          &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
          &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exclusive Facets ====&lt;br /&gt;
An exclusive facet is a facet where the contained values are&lt;br /&gt;
mutually exclusive. That means that the facet must only be present once&lt;br /&gt;
in an autocomplete or query request.&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;exclusive&amp;quot; || Denotes that this is a facet of style exclusive&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| options || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
    &amp;quot;options&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Active Facets ====&lt;br /&gt;
Every value that has been selected by a user must be remembered and provided with every subsequent request. The representation of a facet within a request body differs from the one within an autocomplete response. We call those &amp;quot;active facets&amp;quot;. Their representation is independent from their style.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Active Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Active Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| facet || &amp;lt;string&amp;gt; || The id of the according facet.&lt;br /&gt;
|-&lt;br /&gt;
| value || &amp;lt;string&amp;gt; || The id of the according value. Must always be copied from the value object, not from a possibly according option (in the two-dimensional case).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter object, copied from the value or option.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
According to the users configuration, some restrictions may apply that have to be heeded by clients. Those restrictions can be retrieved via the &amp;quot;config&amp;quot; or the &amp;quot;jslob&amp;quot; modules. The following restrictions may apply:&lt;br /&gt;
&lt;br /&gt;
* A user might have limited access to modules and therefore the Find API may only serve requests for a subset of all possible modules. The configuration object may contain an object with key &amp;quot;modules&amp;quot;. Its value is an array containing all module identifiers that the user is allowed to use. If the user is not allowed to search in any module, the value will be null.&lt;br /&gt;
&lt;br /&gt;
* Some facets can be mandatory, i.e. they must be pre-defined by the client and provided with every request. Whether a facet is mandatory or not is decided on a per-module basis. The configuration object may contain an object with key &amp;quot;mandatory&amp;quot;. Every facet that may be mandatory is specified via its id in that object (e.g. mandatory.folder). The value of such a key is either an array containing all module identifiers, where the facet is mandatory or null, if it is not manadatory in any module.&lt;br /&gt;
  &lt;br /&gt;
* Due to performance reasons the service provider can enforce a minimium number of characters that have to be provided before an autocomplete request may be issued. That property is called &amp;quot;minimumQueryLength&amp;quot; and its value is an integer that specifies the minimum number of characters. If a client does not heed this property, the server will respond with an error if the provided user input is too short.&lt;br /&gt;
&lt;br /&gt;
==== Config Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/config/search?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
            &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                &amp;quot;mail&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;modules&amp;quot;: [&lt;br /&gt;
            &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;contacts&amp;quot;,&lt;br /&gt;
            &amp;quot;calendar&amp;quot;,&lt;br /&gt;
            &amp;quot;tasks&amp;quot;,&lt;br /&gt;
            &amp;quot;drive&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GET http://localhost/appsuite/api/config/minimumSearchCharacters?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSLob Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/jslob?action=get&amp;amp;id=io.ox/core&amp;amp;session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;io.ox/core&amp;quot;,&lt;br /&gt;
        &amp;quot;tree&amp;quot;: {&lt;br /&gt;
            &amp;quot;search&amp;quot;: {&lt;br /&gt;
                &amp;quot;modules&amp;quot;: [&lt;br /&gt;
                    &amp;quot;mail&amp;quot;,&lt;br /&gt;
                    &amp;quot;contacts&amp;quot;,&lt;br /&gt;
                    &amp;quot;calendar&amp;quot;,&lt;br /&gt;
                    &amp;quot;tasks&amp;quot;,&lt;br /&gt;
                    &amp;quot;drive&amp;quot;&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
                    &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                        &amp;quot;mail&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;minimumQueryLength&amp;quot;: 0&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocomplete ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* limit=&amp;lt;int&amp;gt; - The maximum number of values returned per facet&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the users input (specified as &amp;quot;prefix&amp;quot;), already selected facets and possible options.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=autocomplete&amp;amp;module=mail&amp;amp;limit=3&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;prefix&amp;quot;:&amp;quot;test&amp;quot;,  &lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;facets&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },      &lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
        &amp;quot;values&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
            &amp;quot;item&amp;quot;:{&lt;br /&gt;
              &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
              &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;options&amp;quot;:[&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== query ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=query&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* columns=&amp;lt;column-ids&amp;gt; - A comma-separated list of the module-specific columns that shall be contained in the response items.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the selected facets and possible options. For pagination the keys &amp;quot;start&amp;quot; and &amp;quot;size&amp;quot; can be set.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=query&amp;amp;module=mail&amp;amp;columns=102,600,601,602,603,604,605,607,608,610,611,614,652&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:null&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;subject&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:1409579708116,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:{&lt;br /&gt;
        &amp;quot;fields&amp;quot;:[&lt;br /&gt;
          &amp;quot;subject&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;queries&amp;quot;:[&lt;br /&gt;
          &amp;quot;lorem&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start&amp;quot;:0,&lt;br /&gt;
  &amp;quot;size&amp;quot;:101&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;num_found&amp;quot;:-1,&lt;br /&gt;
    &amp;quot;start&amp;quot;:0,&lt;br /&gt;
    &amp;quot;size&amp;quot;:1,&lt;br /&gt;
    &amp;quot;results&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;110458&amp;quot;,&lt;br /&gt;
        &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
        &amp;quot;attachment&amp;quot;:false,&lt;br /&gt;
        &amp;quot;from&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;John Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;john.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;to&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;jane.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cc&amp;quot;:[&lt;br /&gt;
&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;subject&amp;quot;:&amp;quot;Lorem Ipsum&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;:7501,&lt;br /&gt;
        &amp;quot;received_date&amp;quot;:1408531387000,&lt;br /&gt;
        &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
        &amp;quot;priority&amp;quot;:3,&lt;br /&gt;
        &amp;quot;account_name&amp;quot;:&amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
        &amp;quot;account_id&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Available Options ===&lt;br /&gt;
Every request body may contain an &amp;quot;options&amp;quot; object to finetune some specific behavior. Currently possible options are:&lt;br /&gt;
* timezone: &amp;lt;tz-name&amp;gt; - The timezone to use if any dates are returned.&lt;br /&gt;
* admin: &amp;lt;boolean&amp;gt; - true to include the context admin if it matches any search criteria. If the context admin shall always be ignored (i.e. not returned), false has to be set.&lt;br /&gt;
&lt;br /&gt;
=== Possible Flags ===&lt;br /&gt;
Every facet may carry one or more flags that describe further aspects of that facet. Currently possible flags are:&lt;br /&gt;
* conflicts - Specified in the form of &amp;quot;conflicts:&amp;lt;other-id&amp;gt;&amp;quot;. A facet carrying this flag must not be combined with a facet of type &amp;lt;other-id&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;share/management&amp;quot; (preliminary, available with v7.8.0) ==&lt;br /&gt;
&lt;br /&gt;
Share links and can be created and managed via different actions in the &amp;quot;share/management&amp;quot; module. Additionally, there are dedicated actions to list all shares of a user in the modules [[#Get_shared_folders_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;folders&amp;quot;]] and [[#Get_shared_infoitems_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;files&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== Get a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Basic information about an already existing or newly created share link as described in [[#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Target&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| module || String || The folder's module name, i.e. one of &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| folder || String || The folder identifier &lt;br /&gt;
|-&lt;br /&gt;
| item   || String || (Optional) The object identifier, in case the share targets a single item &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareLink&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Link&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| url   || String  || The link to the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| entity   || Number  || The identifier of the anonymous user entity for the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| is_new   || Boolean  || Whether the share link is new, i.e. it has been created by the &amp;lt;tt&amp;gt;getLink&amp;lt;/tt&amp;gt;-request, or if it already existed  (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Time   ||  (Optional) The end date / expiration time after which the share link is no longer accessible.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || (Optional) An additional secret / pin number an anonymous user needs to enter when accessing the share&lt;br /&gt;
|-&lt;br /&gt;
| meta || JSON || (Optional) Arbitrary JSON data saved along with the share as specified by client &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Update a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The last modified timestamp of the link to be updated. Used to detect concurrent modifications.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in [[#ShareLink|Share Link]] containing the properties of the link to update., as well as the share target itself as described in [[#ShareTarget|Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Delete a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be deleted for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Send a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional message can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;drive&amp;quot; ==&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side. &lt;br /&gt;
&lt;br /&gt;
A detailed description can be found in a sepearet article: [[OX_Drive_API|OX Drive API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;passwordchange&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Users can change their password via the &amp;quot;passwordchange&amp;quot; module. &lt;br /&gt;
&lt;br /&gt;
=== Update password ===&lt;br /&gt;
&lt;br /&gt;
Note: The new password will be set without any checks. The client must ensure that it is the password the user wants to set. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/passwordchange?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in PasswordChange.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PasswordChange&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Password change&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| old_password || String || The users' current password or 'null' if the password wasn't set before (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
| new_password || String || The new password the user wants to set or 'null' to remove the password (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File Storage Services ==&lt;br /&gt;
&lt;br /&gt;
File storage services represents a file storage backend; e.g. Drive, Dropbox, etc.&lt;br /&gt;
&lt;br /&gt;
A *File Storage Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a file storage service. Example: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Box File Storage Service&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| configuration || JSON object      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileservice?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of file storage service objects. &lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileservice?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the file storage service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a file storage service object.&lt;br /&gt;
&lt;br /&gt;
== File Storage Accounts ==&lt;br /&gt;
&lt;br /&gt;
A file storage account represents the concrete configuration of an account of a given file storage service.&lt;br /&gt;
A *file storage account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageAccount&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || String      || Identifies a given file storage account in the scope of its file storage service (Infostore, Dropbox.com, Google OneDrive etc.). This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| filestorageService || String  || The identifier of the file storage service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| qualifiedId || String || Identifies a given file storage account globally, i.e. accross all file storage services. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| rootFolder || String || ID of the accounts root folder within the folder tree. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| isDefaultAccount || Boolean || Whether this account is the users default account. Exactly one account will have this flag set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant file storage service &lt;br /&gt;
|-&lt;br /&gt;
| capabilities || List of Strings || A list of capability names. Possible values are: &amp;quot;FILE_VERSIONS&amp;quot;, &amp;quot;EXTENDED_METADATA&amp;quot;, &amp;quot;RANDOM_FILE_ACCESS&amp;quot;, &amp;quot;LOCKS&amp;quot; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are&lt;br /&gt;
&lt;br /&gt;
=== Create a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;filestorageService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delete a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileaccount?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* filestorageService - (optional) list only those accounts that belong to the given file storage service.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example for creating a new OAuth-based file storage account ===&lt;br /&gt;
&lt;br /&gt;
First, get the description of the file storage service for which a new account is supposed to be created:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/fileservice?action=get&amp;amp;id=boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   {&lt;br /&gt;
    id: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
    displayName: &amp;quot;Box File Storage Service&amp;quot;&lt;br /&gt;
    configuration: {&lt;br /&gt;
      widget: &amp;quot;oauthAccount&amp;quot;&lt;br /&gt;
      options: {&lt;br /&gt;
        type: &amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      name: &amp;quot;account&amp;quot;&lt;br /&gt;
      displayName: &amp;quot;Select an existing account&amp;quot;&lt;br /&gt;
      mandatory: true&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next get the associated OAuth account information:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/oauth/accounts?action=all&amp;amp;serviceId=com.openexchange.oauth.boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;data&amp;quot;:[{&amp;quot;id&amp;quot;:333,&amp;quot;displayName&amp;quot;:&amp;quot;My Box.com account&amp;quot;,&amp;quot;serviceId&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;}]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create the file storage account:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  PUT /ajax/fileaccount?action=new&amp;amp;session=...&lt;br /&gt;
  &lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;filestorageService&amp;quot;:&amp;quot;boxcom&amp;quot;,&lt;br /&gt;
    &amp;quot;displayName&amp;quot;:&amp;quot;My box.com account&amp;quot;,&lt;br /&gt;
    &amp;quot;configuration&amp;quot;:{&lt;br /&gt;
      &amp;quot;account&amp;quot;:&amp;quot;333&amp;quot;,&lt;br /&gt;
      &amp;quot;type&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response provides the relative (in context of the according file storage service) identifier of the newly created account:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;data&amp;quot;:19}&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21499</id>
		<title>HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21499"/>
		<updated>2016-02-22T06:25:03Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: /* Get all mails */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This document defines the Open-Xchange HTTP API which is used by the new AJAX GUI. The first chapter describes general definitions and conventions which apply to all server modules. All other chapters describe individual server modules.&lt;br /&gt;
&lt;br /&gt;
=== Low level protocol ===&lt;br /&gt;
&lt;br /&gt;
The client accesses the server through HTTP GET, POST and PUT requests. HTTP cookies are used for authentication and must therefore be processed and sent back by the client as specified by [http://tools.ietf.org/html/rfc6265 RFC 6265]. The HTTP API is accessible at URIs starting with &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;. Each server module has a unique name and its own sub-namespace with that name below &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;, e. g. all access to the module &amp;quot;tasks&amp;quot; is via URIs starting with &amp;lt;code&amp;gt;/ajax/tasks&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Text encoding is always UTF-8. Data is sent from the server to the client as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; and interpreted by the client to obtain an ECMAScript object. The HTTP API uses only a small subset of the ECMAScript syntax. This subset is roughly described by the following BNF:&lt;br /&gt;
&lt;br /&gt;
 Value   ::= &amp;quot;null&amp;quot; | Boolean | Number | String | Array | Object&lt;br /&gt;
 Boolean ::= &amp;quot;true&amp;quot; | &amp;quot;false&amp;quot;&lt;br /&gt;
 Number  ::= see NumericLiteral in ECMA 262 3rd edition&lt;br /&gt;
 String  ::= \&amp;quot;([^&amp;quot;\n\\]|\\[&amp;quot;\n\\])*\&amp;quot;&lt;br /&gt;
 Array   ::= &amp;quot;[]&amp;quot; | &amp;quot;[&amp;quot; Value (&amp;quot;,&amp;quot; Value)* &amp;quot;]&amp;quot;&lt;br /&gt;
 Object  ::= &amp;quot;{}&amp;quot; | &amp;quot;{&amp;quot; Name &amp;quot;:&amp;quot; Value (&amp;quot;,&amp;quot; Name &amp;quot;:&amp;quot; Value)* &amp;quot;}&amp;quot;&lt;br /&gt;
 Name    ::= [A-Fa-f][0-9A-Fa-f_]*&lt;br /&gt;
&lt;br /&gt;
Numbers are the standard signed integer and floating point numbers. Strings can contain any character, except double quotes, newlines and backslashes, which must be escaped by a backslash. Control characters in strings (other than newline) are not supported. Whitespace is allowed between any two tokens. See [http://json.org JSON] and [http://www.ecma-international.org/publications/standards/Ecma-262.htm ECMA 262, 3&amp;lt;sup&amp;gt;rd&amp;lt;/sup&amp;gt; edition] for the formal definition.&lt;br /&gt;
&lt;br /&gt;
The response body consists of an object, which contains up to four fields as described in [[#ResponseBody | Response body]]. The field &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; contains the actual payload which is described in following chapters. The fields &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;error_params&amp;lt;/code&amp;gt; are present when data objects are returned, if an error occurred and if the error message contains conversion specifiers, respectively. Following sections describe the contents of these fields in more detail.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResponseBody&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Response body&lt;br /&gt;
! Name         !! Type      !! Value&lt;br /&gt;
|-&lt;br /&gt;
| data         || Value     || Payload of the response.&lt;br /&gt;
|-&lt;br /&gt;
| timestamp    || Timestamp || The latest timestamp of the returned data (see [[HTTP_API#Updates|Updates]]).&lt;br /&gt;
|-&lt;br /&gt;
| error        || String    || The translated error message. Present in case of errors.&lt;br /&gt;
|-&lt;br /&gt;
| error_params || Array     || As o 7.4.2: Empty JSON array. Before that: Parameters for the error message that would need to be replaced in the error string (in a printf-format style).&lt;br /&gt;
|-&lt;br /&gt;
| error_id     || String    || Unique error identifier to help finding this error instance in the server logs.&lt;br /&gt;
|-&lt;br /&gt;
| error_desc     || String    || The technical error message (always English) useful for debugging the problem. Might be the same as error message if there is no more information available&lt;br /&gt;
|-&lt;br /&gt;
| code         || String    || Error code consisting of an upper-case module identifier and a four-digit message number, separated by a dash; e.g. &amp;quot;MSG-0012&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| error_stack     || Array    || If configured (see &amp;quot;com.openexchange.ajax.response.includeStackTraceOnError&amp;quot; in 'server.properties') this field provides the stack trace of associated Java exception represented as a JSON array&lt;br /&gt;
|-&lt;br /&gt;
| categories     || String OR Array    || Either a single (String) or list (Array) of upper-case category identifiers to which the error belongs. E.g.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| &amp;quot;USER_INPUT&amp;quot;  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFIGURATION&amp;quot;  || An error related to user/system configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;PERMISSION_DENIED&amp;quot;  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRY_AGAIN&amp;quot;  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;SERVICE_DOWN&amp;quot;  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONNECTIVITY&amp;quot;  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;ERROR&amp;quot;  || A programming error which was caused by incorrect program code.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFLICT&amp;quot;  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CAPACITY&amp;quot; || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRUNCATED&amp;quot; || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;WARNING&amp;quot; || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| category     || Number    || Maintained for legacy reasons: The numeric representation of the first category:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| 2  || An error strictly related to user configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| 3  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| 5  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| 6  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| 8  || A programming error which was caused by incorrect programm code.&lt;br /&gt;
|-&lt;br /&gt;
| 9  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| 12 || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Data from the client to the server can be sent in several formats. Small amounts of data are sent as &amp;lt;code&amp;gt;application/x-www-urlencoded&amp;lt;/code&amp;gt; in query parameters in the request URI. For POST requests, some or all parameters may be sent in the request body instead of in the URI using any valid encoding for POST requests. Alternatively, some requests specify that data is sent as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; in the body of a PUT request. The format of the request body for PUT requests is the same as for sending data from the server to the client, except that the payload is sent directly, without being wrapped in another object.&lt;br /&gt;
&lt;br /&gt;
When updating existing data, the client sends only fields that were modified. To explicitly delete a field, the field is sent with the value &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. For fields of type &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, the empty string &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Error handling ===&lt;br /&gt;
&lt;br /&gt;
If the session of the user times out, if the client doesn't send a session ID or if the session for the specified session ID can not be found then the server returns the above described response object, that contains an error code and an error message. If the request URI or the request body is malformed or incomplete then the server returns the reponse object with an error message, too. In case of internal server errors, especially Java exceptions, or if the server is down, it returns the HTTP status code 503, Service Unavailable. Other severe errors may return other HTTP status values.&lt;br /&gt;
&lt;br /&gt;
Application errors, which can be caused by a user and are therefore expected during the operation of the groupware, are reported by setting the field error in the returned object, as described in [[#ResponseBody | Response body]]. Since the error messages are translated by the client, they can not be composed of multiple variable parts. Instead, the error message can contain simplified printf()-style conversion specifications, which are replaced by elements from the array in the field error_params. If error_params is not present, no replacement occurs, even if parts of the error message match the syntax of a conversion specification.&lt;br /&gt;
&lt;br /&gt;
A simplified conversion specification, as used for error messages, is either of the form %s or %''n''$s, where ''n'' is a 1-based decimal parameter index. The conversion specifications are replaced from left to right by elements from error_params, starting at the first element. %s is replaced by the current element and the current index is incremented. %''n''$s is replaced by the ''n''th element and the current index is set to the (''n'' + 1)th element.&lt;br /&gt;
&lt;br /&gt;
Some error message contain data sizes which must be expressed in Bytes or Kilobytes etc., depending on the actual value. Since the unit must be translated, this conversion is performed by the client. Unfortunately, standard printf()-style formatting does not have a specifier for this kind of translation. Therefore, the conversion specification for sizes is the same as for normal strings, and the client has to determine which parameters to translate based on the error code. The current error codes and the corresponding size parameters are listed in [[#DataSizeParameters | Data size parameters]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSizeParameters&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data size parameters&lt;br /&gt;
! Error code !! Parameter indices&lt;br /&gt;
|-&lt;br /&gt;
| CON-0101   || 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| FLS-0003   || 1, 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0065   || 1, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0066   || 1&lt;br /&gt;
|-&lt;br /&gt;
| NON-0005   || 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Date and time ===&lt;br /&gt;
&lt;br /&gt;
Dates without time are transmitted as the number of milliseconds between 00:00 UTC on that date and 1970-01-01 00:00 UTC. Leap seconds are ignored, therefore this number is always an integer multiple of 8.64e7.&lt;br /&gt;
&lt;br /&gt;
Because ECMAScript Date objects have no way to explicitly specify a timezone for calculations, timezone correction must be performed on the server. Dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''user's'' timezone and UTC at the time in question. (See the Java method java.util.TimeZone.getOffset(long)). Unless optional URL parameter &amp;lt;code&amp;gt;'''timezone'''&amp;lt;/code&amp;gt; is present. Then dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''specified'' timezone and UTC at the time in question.&lt;br /&gt;
&lt;br /&gt;
For some date and time values, especially timestamps, monotonicity is more important than the actual value. Such values are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC, ignoring leap seconds and without timezone correction. If possible, a unique strictly monotonic increasing value should be used instead, as it avoids some race conditions described below.&lt;br /&gt;
&lt;br /&gt;
This specification refers to these three interpretations of the type Number as separate data types. The types are described in [[#DateAndTimeTypes | Date and time types]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DateAndTimeTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Date and time types&lt;br /&gt;
! Type      !! Time !! Timezone !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| Date      || No   || UTC      || Date without time.&lt;br /&gt;
|-&lt;br /&gt;
| Time      || Yes  || User     || Date and time.&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || Yes  || UTC      || Timestamp or unique sequence number.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
&lt;br /&gt;
To allow efficient synchronization of a client with changes made by other clients and to detect conflicts, the server stores a timestamp of the last modification for each object. Whenever the server transmits data objects to the client, the response object described in [[#ResponseBody | Response body]] includes the field timestamp. This field contains a timestamp value which is computed as the maximum of the timestamps of all transmitted objects.&lt;br /&gt;
&lt;br /&gt;
When requesting updates to a previously retrieved set of objects, the client sends the last timestamp which belongs to that set of objects. The response contains all updates with timestamps greater than the one specified by the client. The field timestamp of the response contains the new maximum timestamp value.&lt;br /&gt;
&lt;br /&gt;
If multiple different objects may have the same timestamp values, then a race condition exists when an update is processed between two such objects being modified. The first, already modified object will be included in the update response and its timestamp will be the maximum timestamp value sent in the timestamp field of the response. If the second object is modified later but gets the same timestamp, the client will never see the update to that object because the next update request from the client supplies the same timestamp value, but only modifications with greater timestamp values are returned.&lt;br /&gt;
&lt;br /&gt;
If unique sequence numbers can't be used as timestamps, then the risk of the race condition can be at least minimized by storing timestamps in the most precise format and/or limiting update results to changes with timestamp values which are measurably smaller than the current timestamp value.&lt;br /&gt;
&lt;br /&gt;
=== Editing ===&lt;br /&gt;
&lt;br /&gt;
Editing objects is performed one object at a time. There may be multiple objects being edited by the same client simulataneously, but this is achieved by repeating the steps required for editing a single object. There is no batch edit or upload command.&lt;br /&gt;
&lt;br /&gt;
To edit an object, a client first requests the entire object from the server. The server response contains the timestamp field described in the previous section. For in-place editing inside a view of multiple objects, where only already retrieved fields can be changed, retrieving the entire object is not necessary, and the last timestamp of the view is used as the timestamp of each object in it.&lt;br /&gt;
&lt;br /&gt;
When sending the modified object back to the server, only modified fields need to be included in the sent object. The request also includes the timestamp of the edited object. The timestamp is used by the server to ensure that the object was not edited by another client in the meantime. If the current timestamp of the object is greater than the timestamp supplied by the client, then a conflict is detected and the field error is set in the response. Otherwise, the object gets a new timestamp and the response to the client is empty.&lt;br /&gt;
&lt;br /&gt;
If the client displays the edited object in a view together with other objects, then the client will need to perform an update of that view immediately after successfully uploading an edited object.&lt;br /&gt;
&lt;br /&gt;
=== File uploads ===&lt;br /&gt;
&lt;br /&gt;
File uploads are made by sending a POST request that submits both the file and the needed fields as parts of a request of content-type “multipart/form-data” or “multipart/mixed”. The file metadata are stored in a form field “file” (much like an &amp;lt;input type=”file” name=”file” /&amp;gt; would do). In general a call that allows file uploads via POST will have a corresponding call using PUT to send object data. The JSON-encoded object-data that is send as the body of a corresponding PUT call is, when performed as a POST with file uploads, put into the request parameter “json”.&lt;br /&gt;
&lt;br /&gt;
Since the upload is performed directly by the browser and is not an Ajax call, the normal callback mechanism for asynchronous Javascript calls cannot be used to obtain the result. For this reason the server responds to these POST calls with a complete HTML page that performs the callback and should not be displayed to the user. The HTML response is functionally equivalent to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
     &amp;lt;head&amp;gt;&lt;br /&gt;
         &amp;lt;META http-equiv=&amp;quot;Content-Type&amp;quot; content=\&amp;quot;text/html; charset=UTF-8\&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
             (parent[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;] || window.opener &amp;amp;&amp;amp; window.opener[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;])&lt;br /&gt;
             (&amp;lt;b&amp;gt;{json}&amp;lt;/b&amp;gt;)&lt;br /&gt;
         &amp;lt;/script&amp;gt;&lt;br /&gt;
     &amp;lt;/head&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The placeholders &amp;lt;code&amp;gt;{json}&amp;lt;/code&amp;gt; is replaced by the response with the timestamp that would be expected from the corresponding PUT method. The placeholder &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; is replaced by the value of the parameter &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; of the request (except for the import bundle, which is named &amp;quot;import&amp;quot; instead of the action name for legacy purposes). The content-type of the answer is &amp;lt;code&amp;gt;text/html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Non-browser clients don't need to interpret HTML or JavaScript. The JSON data can be recognized by the outermost &amp;lt;code&amp;gt;({&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;})&amp;lt;/code&amp;gt;, where the inner braces are part of the JSON value. For example, the regular expression &amp;lt;code&amp;gt;\((\{.*\})\)&amp;lt;/code&amp;gt; captures the entire JSON value in its first capturing group.&lt;br /&gt;
&lt;br /&gt;
=== Documentation conventions ===&lt;br /&gt;
&lt;br /&gt;
The rest of this document describes all available requests for each module. A module usually supports several different requests, which are differentiated by the used HTTP method, URI path and supplied URI parameters. The description of each method generally contains the following elements:&lt;br /&gt;
* the HTTP method followed by the request URI, inclusing the URI parameter action, which is used to differentiate methods,&lt;br /&gt;
* a list of URI parameters which can or must be supplied by the client,&lt;br /&gt;
* for PUT requests, content of the request body,&lt;br /&gt;
* for POST requests all described parameters are normally expected in the request body, exceptions are documented,&lt;br /&gt;
* &amp;quot;Response with timestamp:&amp;quot;if the timestamp field is required in the response body or simply &amp;quot;Response:&amp;quot; if not,&lt;br /&gt;
* content of the response payload, unless it is supposed to be empty.&lt;br /&gt;
&lt;br /&gt;
=== Common object data ===&lt;br /&gt;
&lt;br /&gt;
This table contains common fields which apply for any module's data type and is referenced throughout this document whenever a module's data type is described.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonObjectData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common object data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|-&lt;br /&gt;
| 100  || categories     || String  || String containing comma separated the categories. Order is preserved. Changing the order counts as modification of the object. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 101  || private_flag     || Boolean  || Overrides folder permissions in shared private folders: When true, this object is not visible to anyone except the owner. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 102  || color_label  || Number  || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive). Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 104  || number_of_attachments     || Number  || Number of attachments &lt;br /&gt;
|-&lt;br /&gt;
| 105 || lastModifiedOfNewestAttachmentUTC || Time || Date and time of the newest attachment written with UTC time zone.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;login&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The login module is used to obtain a session from the user's login credentials. To understand the details of the different login methods, see the article titled &amp;quot;[[Login variations]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Because of security reasons each login variation will reject requests containing the parameter &amp;quot;password&amp;quot; within the URL query (starting with 7.8.0).&lt;br /&gt;
&lt;br /&gt;
=== Login ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters are normally expected in the POST request body:&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password MUST be placed in the request body, otherwise the login request will be denied.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; (optional) – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method.&lt;br /&gt;
&lt;br /&gt;
=== Form Login (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=formlogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request implements a possible login to the web frontend by only using a simple HTML form. An example for such a form can be found in the backend's documentation folder (&amp;lt;code&amp;gt;/usr/share/doc/open-xchange-core&amp;lt;/code&amp;gt;) under &amp;lt;code&amp;gt;examples/login.html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client must be the same as the client sent by the UI in the normal login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI. The URL of the web UI is either taken from the given parameter or from the configured default of the backend.&lt;br /&gt;
&lt;br /&gt;
For a complete description of the FormLogin-Process please see [[FormLogin|this documentation]]&lt;br /&gt;
&lt;br /&gt;
=== Token Login (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokenLogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows every possible client to create a very short living session. This session can then be transferred to any other client preferably a browser entering then the normal web interface. Then the sessions life time will be extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Compared to the login mechanism using the random token, this request is more secure because two tokens are used. One of these tokens is only known to the client and one is generated by the server. Only the combination of both tokens allows to use the session. The combination of both tokens must be done by the client creating the session.&lt;br /&gt;
&lt;br /&gt;
DISCLAIMER: This request MUST NOT be used by some server side instance. If some server side instance uses this request to create a session for a browser on some client machine, then you have to transfer the full URL with server and client token over some connection to the client. This creates a VULNERABILITY if this is done. The token login method is only secure if this request is already sent from the same machine that later runs the browser using the created session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login information.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client should be the same as the client sent by the UI in the normal login request. For security considerations it can become necessary to define here the correct client that will use the session.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Version of the HTTP/JSON interface client. Only for statistic evaluations.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail. This must be enabled on the server and a client can test with the autologin request if it is enabled or not.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used. Currently the IP address may change when using the session with both tokens. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used. Currently the User-Agent may change when using the session. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;jsonResponse&amp;lt;/code&amp;gt; (optional, since 7.8.0) – true or false (default). Defines the returned data type as JSON. Default 'false' will return a redirect. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI (or JSON including the redirect url in case jsonResponse=true is set). The URL of the web UI is either taken from the given parameter or from the configured default of the backend. This redirect will only contain the server side token. The client side token sent in the request must be appended by the client creating the session. The final URL must have the form &amp;lt;code style=&amp;quot;white-space: nowrap&amp;quot;&amp;gt;&amp;lt;var&amp;gt;redirect_URL&amp;lt;/var&amp;gt;&amp;amp;amp;clientToken=&amp;lt;var&amp;gt;token&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;. Both tokens are necessary to use the session and both tokens must match. Otherwise the session is terminated.&lt;br /&gt;
&lt;br /&gt;
=== Tokens (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokens&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows clients to access a session created with the [[#Token_Login_.28since_7.0.1.29 | tokenLogin]] request. When accessing the session its life time is extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;serverToken&amp;lt;/code&amp;gt; – Server side identifier for accessing the session. This identifier was created by the server and is contained in the tokenLogin response.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. This identifier was created by the client and passed within the POST data of the tokenLogin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. Currently this request allows to change the client identifier for the session. This eases creating the session because the identifier of the client using the session must not be known. For security considerations it can become necessary to drop this parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object conform to the normal [[#ResponseBody | response body]] contrary to the JSON object of the normal login request. This JSON object contains the session identifier, the login, the identifier and the locale of the user.&lt;br /&gt;
&lt;br /&gt;
=== Logout ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=logout&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh secret cookie (since 6.18.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=refreshSecret&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh auto-login cookie ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=store&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Redirect ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login;jsessionid=1157370816112.OX1?action=redirect&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURITY WARNING!''' Utilizing this request is '''INSECURE'''! This request allows to access a session with a single one time token. This one time token may be delivered to the wrong client if the protocol has an error or Apache or the load balancer make a mistake. This will cause a wrong user to be in a wrong session. '''IMMEDIATELY''' consider not to use this request anymore. You have been warned. Use instead the FormLogin that does not need to use the redirect request.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;random&amp;lt;/code&amp;gt; – A session random token to jump into the session. This random token is part of the login response. Only a very short configurable time after the login it is allowed to jump into the session with the random token.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – The client can be defined here newly if it is not correct on the login request itself.&lt;br /&gt;
* &amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt; (optional) – Tells the UI to do a store request after login to be able to use autologin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – The optional path on the webserver to the UI. If this parameter is not given the configured uiWebPath is used.&lt;br /&gt;
&lt;br /&gt;
=== Change IP ===&lt;br /&gt;
&lt;br /&gt;
The following request is especially for integration with systems located in the providers infrastructure. If those systems create a session with the following request the client host IP address in the session can be changed. The IP check for following requests will be done using this newly set client host IP address.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=changeip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; – New IP address of the client host for the current session.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the string &amp;quot;1&amp;quot; as data attribute.&lt;br /&gt;
&lt;br /&gt;
=== Redeem Token (since 7.4.0)===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=redeemToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; – The token created with [[#Get_a_login_token | acquireToken]].&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request. &lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. The client must identifier must be the same for each request after creating the login session. &lt;br /&gt;
* &amp;lt;code&amp;gt;secret&amp;lt;/code&amp;gt; – The value of the secret string for token logins. This is configured through the tokenlogin-secrets configuration file.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method. If configured within tokenlogin-secrets configuration file even the user password will be returned.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;config&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The config module is used to retrieve and set user-specific configuration. The configuration is stored in a tree. Each node of the tree has a name and a value. The values of leaf nodes are strings which store the actual configuration data. The values of inner nodes are defined recursively as objects with one field for each child node. The name and the value of each field is the name and the value of the corresponding child node, respectively.&lt;br /&gt;
&lt;br /&gt;
The namespace looks like the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/ajax/config/&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; – A string containing GUI-specific settings (currently, it is a huge [[#Low_level_protocol | JSON]] object).&lt;br /&gt;
** &amp;lt;code&amp;gt;fastgui&amp;lt;/code&amp;gt; - A string containing GUI-specific settings. This is a JSON object that must be kept small for performance.&lt;br /&gt;
** &amp;lt;code&amp;gt;context_id&amp;lt;/code&amp;gt; - the unique identifier of the context (read-only, added 2008-01-28).&lt;br /&gt;
** &amp;lt;code&amp;gt;cookielifetime&amp;lt;/code&amp;gt; - the cookie life time in seconds or &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; for session cookie (read-only, added 2010-11-16).&lt;br /&gt;
** &amp;lt;code&amp;gt;identifier&amp;lt;/code&amp;gt; – the unique identifier of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;contact_id&amp;lt;/code&amp;gt; – the unique identifier of the contact data of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; – the configured language of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; – the configured timezone of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;availableTimeZones&amp;lt;/code&amp;gt; – a JSON object containing all available time zones. The key is the time zone identifier and the value contains its name in users language. (read-only, added 2010-07-08/v6.18).&lt;br /&gt;
** &amp;lt;code&amp;gt;calendarnotification&amp;lt;/code&amp;gt; - send a mail notification for appointments (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;tasknotification&amp;lt;/code&amp;gt; - send a mail notification for tasks (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;reloadTimes&amp;lt;/code&amp;gt; - Selectable times for GUI reload&lt;br /&gt;
** &amp;lt;code&amp;gt;serverVersion&amp;lt;/code&amp;gt; - Version string of the server.&lt;br /&gt;
** &amp;lt;code&amp;gt;currentTime&amp;lt;/code&amp;gt; - User timezone specific long of the current server time.&lt;br /&gt;
** &amp;lt;code&amp;gt;maxUploadIdleTimeout&amp;lt;/code&amp;gt; - Timeout after that idle uploads are deleted.&lt;br /&gt;
** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard folder of the user&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt; – the standard task folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt; – the standard calendar folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt; – the standard contacts folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt; – the private infostore folder (read-only, since v6.20.1)&lt;br /&gt;
*** &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt; – whether EAS folder selection is enabled (read-only)&lt;br /&gt;
** &amp;lt;code&amp;gt;mail/&amp;lt;/code&amp;gt; – settings for the email module (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with.  (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard email folders (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;htmlinline&amp;lt;/code&amp;gt; – activate inlining of HTML attachments. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;colorquote&amp;lt;/code&amp;gt; – color quoted lines. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;harddelete&amp;lt;/code&amp;gt; – delete emails at once. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;inlineforward&amp;lt;/code&amp;gt; – forward messages as inline or attachment. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;notifyonreadack&amp;lt;/code&amp;gt; – notify on read acknowledgement. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;msgpreview&amp;lt;/code&amp;gt; – show a message preview. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;ignorereplytext&amp;lt;/code&amp;gt; (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;nocopytosent&amp;lt;/code&amp;gt; – don't put a copy to the sent folder when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; - Spam Button should be displayed in GUI or not. (deprecated 2008-04-29)&lt;br /&gt;
** &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;autoSearch&amp;lt;/code&amp;gt; - If a search for all users, groups and resources when participant selection dialog is opened. (read-only, added 2008-10-09/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;maximumNumberParticipants&amp;lt;/code&amp;gt; – Defines the maximum number of participants for appointments and tasks. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;showWithoutEmail&amp;lt;/code&amp;gt; - If external participants without email should be shown.&lt;br /&gt;
*** &amp;lt;code&amp;gt;showDialog&amp;lt;/code&amp;gt; – Enables participant selection dialog for appointments and tasks. (read-only, added 2008-04-30/SP4)&lt;br /&gt;
** &amp;lt;code&amp;gt;availableModules&amp;lt;/code&amp;gt; – Contains a JSON array listing all enabled modules for a user. GUI loads Plugins through this list. To get your plugin listed here, create a subtree below &amp;lt;code&amp;gt;modules/&amp;lt;/code&amp;gt; without a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; subelement or with a subelement containing &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; (read-only, added 2008-02-25)&lt;br /&gt;
** &amp;lt;code&amp;gt;minimumSearchCharacters&amp;lt;/code&amp;gt; – Minimum number of characters a search pattern must have to prevent large responses and slow queries. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
** &amp;lt;code&amp;gt;modules&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;portal&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for portal module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;appendmailtext&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allowhtmlimages&amp;lt;/code&amp;gt; – Alters default setting whether external images contained in HTML content are allowed or not (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;colorquoted&amp;lt;/code&amp;gt; – color quoted lines (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectFolder&amp;lt;/code&amp;gt; – contact folder id to save mail addresses from sent mails (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectEnabled&amp;lt;/code&amp;gt; – switch contact collection on/off (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailAccess&amp;lt;/code&amp;gt; – enables/disables contact collection for incoming mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailTransport&amp;lt;/code&amp;gt; – enables/disables contact collection for outgoing mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;deletemail&amp;lt;/code&amp;gt; – delete emails or move to trash (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
***** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;forwardmessage&amp;lt;/code&amp;gt; – forward messages as inline or attachment (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for mail module&lt;br /&gt;
**** &amp;lt;code&amp;gt;inlineattachments&amp;lt;/code&amp;gt; – activate inlining of HTML attachments (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;linewrap&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – if mail module is enabled or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;phishingheaders&amp;lt;/code&amp;gt; – header(s) identifying phishing headers (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;replyallcc&amp;lt;/code&amp;gt; – put all recipients on reply all into CC (added 2008-12-16/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; – Spam Button should be displayed in GUI or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails (added 2008-02-25)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_conflict&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_teamview&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the calendar module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted appointments (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPrivate&amp;lt;/code&amp;gt; Default status for new appointments in private folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPublic&amp;lt;/code&amp;gt; Default status for new appointments in public folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the contacts module&lt;br /&gt;
**** &amp;lt;code&amp;gt;mailAddressAutoSearch&amp;lt;/code&amp;gt; – Define if a search is triggered when the recipient selection dialog is opened or the folder is changed. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; True if the contact module is enabled for the current user, false otherwise.&lt;br /&gt;
**** &amp;lt;code&amp;gt;singleFolderSearch&amp;lt;/code&amp;gt; – True if the current user is allowed to search for contacts only in a single folder. False if contact searches across all folders are allowed. (read-only, added 2009-02-04/SP5 U1)&lt;br /&gt;
**** &amp;lt;code&amp;gt;characterSearch&amp;lt;/code&amp;gt; – True if the side bar for searching for contacts by a start letter should be displayed. False if the side bar should be hidden. (read-only, added 2009-05-29/6.10)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allFoldersForAutoComplete&amp;lt;/code&amp;gt; – true if an auto complete search may omit the folder identifier array and search for contacts in all readable folders. This is configured through the contact.properties configuration file. (read-only, added 2010-07-22/v6.18.0)&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the tasks module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;delegate_tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted tasks (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined tasks created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined taks that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the infostore module&lt;br /&gt;
**** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – the standard infostore folders (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the default infostore trash folder (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;pictures&amp;lt;/code&amp;gt; – identifier of the default infostore pictures folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;documents&amp;lt;/code&amp;gt; – identifier of the default infostore documents folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;music&amp;lt;/code&amp;gt; – identifier of the default infostore music folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;videos&amp;lt;/code&amp;gt; – identifier of the default infostore videos folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;templates&amp;lt;/code&amp;gt; – identifier of the default infostore templates folder (read-only, since 7.8.0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;interfaces&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;ical&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;syncml&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; UI settings for the folder tree&lt;br /&gt;
**** &amp;lt;code&amp;gt;public_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – Selected folder tree, the user wants to use. Currents trees are 0 for the known OX folder tree and 1 for the new virtual folder tree. (added 2010-04-09/6.18)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.extras&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Extras link in the configuration (read only, added 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to change the Password within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.personaldata&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to edit personal contact information within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.group&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit groups and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.resource&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit resources and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.publish&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to publish items. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to subscribe sources. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;olox20&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Tells the UI if the user is allowed to use the OXtender for Microsoft Outlook 2. (read only, added 2011-03-15/6.20)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is set to false to prevent the UI from trying to load a plugin. (read only, added 2011-03-15/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
****&amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is true if the OXUpdater package is installed and started. (read only, added 2011-06-01/6.20)&lt;br /&gt;
****&amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Is true if the user is allowed to download the OXUpdater. Otherwise it's false. (read only, added 2011-06-01/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;showStrength&amp;lt;/code&amp;gt; – Show a widget, which displays the current passwort Strength while entering. (default: false)&lt;br /&gt;
**** &amp;lt;code&amp;gt;minLength&amp;lt;/code&amp;gt; – The minimum length of an entered password. (default: 4)&lt;br /&gt;
**** &amp;lt;code&amp;gt;maxLength&amp;lt;/code&amp;gt; – The maximum length of an entered password. 0 for unlimited. (default: 0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;regexp&amp;lt;/code&amp;gt; – Defines the class of allowed special characters as Regular Expression. (default: [^a-z0-9])&lt;br /&gt;
**** &amp;lt;code&amp;gt;special&amp;lt;/code&amp;gt; – Shows an example of allowed special characters to the user. Should be a subset of &amp;quot;regexp&amp;quot; in a human readable format. (default: $, _, or %) &lt;br /&gt;
&lt;br /&gt;
=== Get configuration data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
=== Set configuration data ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The new value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config?action=get_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1234&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
Note: Only allowed for context administrator!&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config?action=set_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to set.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the value to set; e.g&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;value&amp;quot;:&amp;quot;test1237&amp;quot;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its new value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1237&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;folders&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The folders module is used to access the OX folder structure.&lt;br /&gt;
&lt;br /&gt;
=== Special System Folders ===&lt;br /&gt;
&lt;br /&gt;
Folders with some kind of special.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! ID !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 6 || contacts || System Users&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get root folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=root&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response: An array with data for all folders at the root level of the folder structure. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common folder data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 6 || last_modified_utc || Timestamp || Timestamp of the last modification. Note that the type is Timestamp, not Time. See [[#Date and time]] for details. (added 2008-10-17, with SP5, temporary workaround)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed folder data&lt;br /&gt;
! ID  !! Name            !! Type             !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || title           || String           || Name of this folder.&lt;br /&gt;
|-&lt;br /&gt;
| 301 || module          || String           || Name of the module which implements this folder; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot;, or &amp;quot;mail&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 302 || type            || Number           || Type of folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || private&lt;br /&gt;
|-&lt;br /&gt;
| 2 || public&lt;br /&gt;
|-&lt;br /&gt;
| 3 || shared&lt;br /&gt;
|-&lt;br /&gt;
| 5 || system folder&lt;br /&gt;
|-&lt;br /&gt;
| 7 || This type is no more in use (legacy type). Will be removed with a future update!&lt;br /&gt;
|-&lt;br /&gt;
| 16 || trash&lt;br /&gt;
|-&lt;br /&gt;
| 20 || pictures&lt;br /&gt;
|-&lt;br /&gt;
| 21 || documents&lt;br /&gt;
|-&lt;br /&gt;
| 22 || music&lt;br /&gt;
|-&lt;br /&gt;
| 23 || videos&lt;br /&gt;
|-&lt;br /&gt;
| 24 || templates&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 304 || subfolders      || Boolean          || true if this folder has subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || own_rights      || Number or String || Permissions which apply to the current user, as described either in [[#PermissionFlags | Permission flags]] or in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| 306 || permissions     || Array            || Each element is an object described in [[#PermissionObject | Permission object]].&lt;br /&gt;
|-&lt;br /&gt;
| 307 || summary         || String           || Information about contained objects.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || standard_folder || Boolean          || Indicates whether or not folder is marked as a default folder (only OX folder)&lt;br /&gt;
|-&lt;br /&gt;
| 309 || total           || Number           || The number of objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 310 || new             || Number           || The number of new objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 311 || unread          || Number           || The number of unread objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 312 || deleted         || Number           || The number of deleted objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 313 || capabilities || Number || Bit mask containing information about mailing system capabilites, as described in [[#Capabilities | capabilities]].&lt;br /&gt;
|-&lt;br /&gt;
| 314 || subscribed || Boolean || Indicates whether this folder should appear in folder tree or not. '''Note:''' Standard folders cannot be unsubscribed.&lt;br /&gt;
|-&lt;br /&gt;
| 315 || subscr_subflds || Boolean || Indicates whether subfolders should appear in folder tree or not.&lt;br /&gt;
|-&lt;br /&gt;
| 316 || standard_folder_type || Number || Indicates the default folder type. Zero for non-default folder. See [[#DefaultTypes | Standard folder types]]&lt;br /&gt;
|-&lt;br /&gt;
| 317 || supported_capabilities || Array || Each element is a String identifying a supported folder capability as described in [[#SupportedCapabilities | supported capabilities]]. Only applicable for non-mail folders. Read Only, Since 7.4.0.&lt;br /&gt;
|-&lt;br /&gt;
| 318 || account_id || String || Will be &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; if the folder does not belong to any account&lt;br /&gt;
(i.e. if its module doesn't support multiple accounts), is a virtual folder or an account-agnostic system folder. Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 3010 || com.openexchange.publish.publicationFlag || Boolean || Indicates whether this folder is published. Read Only, provided by the com.openexchange.publish plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3020 || com.openexchange.subscribe.subscriptionFlag || Boolean || Indicates whether this folder has subscriptions storing their content in this folder. Read Only, provided by the com.openexchange.subscribe plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3030 || com.openexchange.folderstorage.displayName || String || Provides the display of the folder's owner. Read Only, Since 6.20.&lt;br /&gt;
|-&lt;br /&gt;
| 3060 || com.openexchange.share.extendedPermissions || Array || Each element is an object described in [[#ExtendedPermissionObject | Extended permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  0-6 || Folder permissions:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || See the folder.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Create objects in the folder. '''Note''': '''Does not apply to folders of module ''system'''''.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || Create subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Create subfolders&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&amp;lt;br&amp;gt;'''NOTE''': ''Create objects in the folder'' is not covered by ''Create subfolders'' if folder's module is ''system''.&lt;br /&gt;
|-&lt;br /&gt;
|  7-13 || Read permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Read only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Read all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Read all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 14-20 || Write permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Modify only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Modify all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Modify all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 21-27 || Delete permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Delete only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Delete all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Delete all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 28    || Admin flag:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Every operation modifying the folder in some way requires this permission. This are e.g. changing the folder name, modifying the permissions, deleting or moving the folder.&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || For non-mail folders, a number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| rights || String  || For mail folders, the rights string as defined in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capabilities&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Mailing system supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Mailing system supports ordering mails by their thread reference.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Mailing system supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Mailing system supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Mailing system supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note''': Capabilities describe the entire mailing system (mail account), not the specific folder in which they are transmitted. E.g. bit 4 of the capabilities on the user's inbox describes whether subscriptions are supported by the default account, even though the inbox itself cannot be unsubscribed because it's a standard folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DefaultTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Standard Folder Types&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || No default folder.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Task.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Calendar.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Contact.&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Inbox.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Infostore.&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Drafts.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Sent.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Spam.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Trash.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SupportedCapabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Supported Capabilities&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| permissions || Folder storage supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| publication || Folder storage supports folder publication.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Folder storage supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| sort || Folder storage supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| subscription || Folder storage supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get subfolders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;errorOnDuplicateName&amp;lt;/code&amp;gt; – An optional flag to enable or disable (default) check for duplicate folder names within returned folder response (since v6.20.1). If a duplicate folder name is detected, an appropriate error is returned as [[#ResponseBody | response]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders, which have the folder with the requested object ID as parent. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get path ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of a folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all parent nodes until root folder. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for new, modified and deleted folders. New and modified folders are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted folders (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a folder ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested folder. The fields of the object are listed in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id is not present. Since OX access controls are folder-based, the folder object also defines the permissions for the objects it contains. The permissions for a given user or group are defined by the object described in [[#PermissionObject | Permission object]]. The format of the actual permissions depends on the type of the folder. The permissions of mail folders are transmitted as a rights string as defined in section 3 of RFC 2086. Permissions of all other folders are transmitted as a single nonnegative integer number. The permissions for any given action on the folder or on contained objects is defined by a group of bits in the binary representation of this number. Each group of bits is interpreted as a separate number. Zero always means &amp;quot;no permissions&amp;quot;. Any other values add new permissions and always include the permissions of all lower values. The individual values are described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
&lt;br /&gt;
=== Update a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated folder. If the folder was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;cascadePermissions&amp;lt;/code&amp;gt; – (Optional. Defaults to false) Flag to cascade permissions to all sub-folders. The user must have administrative permissions to all sub-folders subject to change. If one permission change fails, the entire operation fails. (Since 7.8.0)&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. Only modified fields are present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder_id&amp;lt;/code&amp;gt; – The parent folder of the newly created folder&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id should not be present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provided that permission is granted to create a folder, its module is bound to the limitation, that the new folder's module must be equal to parent folder's module except that:&lt;br /&gt;
* Parent folder is one of the system folders &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt;. Below these folders task, calendar, and contact modules are permitted.&lt;br /&gt;
* Parent folder's module is one of task, calendar, or contact. Below this kind of folders task, calendar, and contact modules are permitted.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created folder.&lt;br /&gt;
&lt;br /&gt;
=== Delete folders ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The optional timestamp of the last update of the deleted folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered. &lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the folders are deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the folders are not yet located below the trash folder, they are moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of the folders that shall be deleted.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of folders that were '''NOT''' deleted. There may be a lot of different causes for a not deleted folder: A folder has been modified in the mean  time, the user does not have the permission to delete it or those permissions have just been removed, the folder does not exist, etc.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content  ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=clear&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
=== Get all visible folder of a certain module  (since v6.18.2)  ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=allVisible&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;)&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; –  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object containing three fields: &amp;quot;private&amp;quot;, &amp;quot;public, and &amp;quot;shared&amp;quot;. Each field is a JSON array with data for all folders. Each folder is itself described by an array.&lt;br /&gt;
&lt;br /&gt;
=== Get shared folders (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. \&amp;quot;tasks\&amp;quot;, \&amp;quot;calendar\&amp;quot;, \&amp;quot;contacts\&amp;quot;, \&amp;quot;infostore\&amp;quot;). Note: this action is not implemented for module &amp;quot;mail&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders that are considered as shared by the user. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared folder (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared folder to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;tasks&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The tasks module is used to access task information.&lt;br /&gt;
&lt;br /&gt;
=== Get all tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskAndAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task and appointment data&lt;br /&gt;
! ID  !! Name                     !! Type         !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 200 || title                    || String       || Short description.&lt;br /&gt;
|-&lt;br /&gt;
| 201 || start_date               || Date or Time || Inclusive start of the event as Date for tasks and whole day appointments and Time for normal appointments. For sequencies, this date must be part of the sequence, i. e. sequencies always start at this date. (deprecated for tasks since v7.6.1, replaced by start_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 202 || end_date                 || Date or Time || Exclusive end of the event as Date for tasks and whole day appointments and as Time for normal appointments.  (deprecated for tasks since v7.6.1, replaced by end_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 203 || note                     || String       || Long description.&lt;br /&gt;
|-&lt;br /&gt;
| 204 || alarm                    || Number or Time || Specifies when to notify the participants as the number of minutes before the start of the appointment (-1 for &amp;quot;no alarm&amp;quot;). For tasks, the Time value specifies the absolute time when the user should be notified.&lt;br /&gt;
|-&lt;br /&gt;
| 209 || recurrence_type          || Number       || Specifies the type of the recurrence for a task sequence:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none (single event)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || daily&lt;br /&gt;
|-&lt;br /&gt;
| 2 || weekly&lt;br /&gt;
|-&lt;br /&gt;
| 3 || monthly&lt;br /&gt;
|-&lt;br /&gt;
| 4 || yearly&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 212 || days                     || Number       || Specifies which days of the week are part of a sequence. The value is a bitfield with bit 0 indicating sunday, bit 1 indicating monday and so on. May be present if recurrence_type &amp;gt; 1. If allowed but not present, the value defaults to 127 (all 7 days).&lt;br /&gt;
|-&lt;br /&gt;
| 213 || day_in_month             || Number       || Specifies which day of a month is part of the sequence. Counting starts with 1. If the field &amp;quot;days&amp;quot; is also present, only days selected by that field are counted. If the number is bigger than the number of available days, the last available day is selected. Present if and only if recurrence_type &amp;gt; 2.&lt;br /&gt;
|-&lt;br /&gt;
| 214 || month                    || Number       || Month of the year in yearly sequencies. 0 represents January, 1 represents February and so on. Present if and only if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 215 || interval                 || Number       || Specifies an integer multiplier to the interval specified by recurrence_type. Present if and only if recurrence_type &amp;gt; 0. Must be 1 if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 216 || until                    || Date         || Inclusive end date of a sequence. May be present only if recurrence_type &amp;gt; 0. The sequence has no end date if recurrence_type &amp;gt; 0 and this field is not present. Note: since this is a Date, the entire day after the midnight specified by the value is included.&lt;br /&gt;
|-&lt;br /&gt;
| 217 || notification             || Boolean      || If true, all participants are notified of any changes to this object. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client.&lt;br /&gt;
|-&lt;br /&gt;
| 220 || participants             || Array        || Each element identifies a participant, user, group or booked resource as described in [[#Participant | participant table]].&lt;br /&gt;
|-&lt;br /&gt;
| 221 || users                    || Array        || Each element represents a participant as described in [[#UserParticipantObject | User participant object]]. User groups are resolved and are represented by their members. Any user can occur only once.&lt;br /&gt;
|-&lt;br /&gt;
| 222 || occurrences || Number || Specifies how often a recurrence should appear. May be present only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 223 || uid || String || Can only be written when the object is created. Internal and external globally unique identifier of the appointment or task. Is used to recognize appointments within iCal files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 224 || organizer || String || Contains the email address of the appointment organizer which is not necessarily an internal user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 225 || sequence || Number || iCal sequence number. Not implemented for tasks. Must be incremented on update. Will be incremented by the server, if not set.&lt;br /&gt;
|-&lt;br /&gt;
| 226 || confirmations || Array || Each element represents a confirming participant as described in [[#ConfirmingParticipant | confirming participant]]. This can be internal and external user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 227 || organizerId || Number || Contains the userIId of the appointment organizer if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 228 || principal || String || Contains the email address of the appointment principal which is not necessarily an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 229 || principalId || Number || Contains the userIId of the appointment principal if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 401 || full_time   || Boolean || True if the event is a whole day appointment or task, false otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Participant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant identifier&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || User ID&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 2 || user group&lt;br /&gt;
|-&lt;br /&gt;
| 3 || resource&lt;br /&gt;
|-&lt;br /&gt;
| 4 || resource group&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || mail address of an external participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UserParticipantObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | User participant object&lt;br /&gt;
! Name           !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id             || Number || User ID. Confirming for other users only works for appointments and not for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| display_name   || String || Displayable name of the participant.&lt;br /&gt;
|-&lt;br /&gt;
| confirmation   || Number ||&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| confirmmessage || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConfirmingParticipant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Confirming participant&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || email address of external participant&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || display name of external participant&lt;br /&gt;
|-&lt;br /&gt;
| status || Number ||&lt;br /&gt;
{|&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| message || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task data&lt;br /&gt;
! ID  !! Name              !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || status            || Number || Status of the task:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || not started&lt;br /&gt;
|-&lt;br /&gt;
| 2 || in progress&lt;br /&gt;
|-&lt;br /&gt;
| 3 || done&lt;br /&gt;
|-&lt;br /&gt;
| 4 || waiting&lt;br /&gt;
|-&lt;br /&gt;
| 5 || deferred&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 301 || percent_completed || Number || How much of the task is completed. An integer number between 0 and 100.&lt;br /&gt;
|-&lt;br /&gt;
| 302 || actual_costs|| Number || A monetary attribute to store actual costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 303 || actual_duration&lt;br /&gt;
|-&lt;br /&gt;
| 304 || after_complete || Date || Deprecated. Only present in AJAX interface. Value will not be stored on OX server.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || billing_information&lt;br /&gt;
|-&lt;br /&gt;
| 307 || target_costs|| Number || A monetary attribute to store target costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || target_duration&lt;br /&gt;
|-&lt;br /&gt;
| 309 || priority || Number || 1 = LOW, 2 = MEDIUM, 3 = HIGH&lt;br /&gt;
|-&lt;br /&gt;
| 312 || currency&lt;br /&gt;
|-&lt;br /&gt;
| 313 || trip_meter&lt;br /&gt;
|-&lt;br /&gt;
| 314 || companies&lt;br /&gt;
|-&lt;br /&gt;
| 315 || date_completed&lt;br /&gt;
|-&lt;br /&gt;
| 316 || start_time               || Date or Time || Inclusive start as Date for whole day tasks and Time for normal tasks. &lt;br /&gt;
|-&lt;br /&gt;
| 317 || end_time                 || Date or Time || Exclusive end as Date for whole day tasks and as Time for normal tasks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested tasks.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; – Which kinds of updates should be ignored. Omit this parameter or set it to &amp;quot;deleted&amp;quot; to not have deleted tasks identifier in the response. Set this parameter to &amp;quot;false&amp;quot; and the response contains deleted tasks identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted tasks. New and modified tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted tasks would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a task ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the task's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested task. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder Identifier through that the task is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated task.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated task. If the task was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
=== Create a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created task.&lt;br /&gt;
&lt;br /&gt;
=== Delete task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An object in the field “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete tasks (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Confirm task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the to confirm task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through that the task is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirm task.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot; and &amp;quot;confirmmessage&amp;quot; as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Search for tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified , then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object with attributes described in [[#SearchTasks | Search tasks]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchTasks&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search tasks&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find tasks. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || (optional) Defines the folder to search for tasks in. If this is omitted in all task folders will be searched.&lt;br /&gt;
|-&lt;br /&gt;
| start || Date or Time || (optional) Inclusive start date for a time range the tasks should end in. If start is omitted end is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| end || Date or Time || (optional) Exclusive end date for a time range the tasks should end in. If this parameter is omitted the time range has an open end.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with matching tasks. Tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;contacts&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The contacts module is used to access contact information.&lt;br /&gt;
&lt;br /&gt;
=== Get all contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried (optional from 6.22.2 on: If not set, the contents of all visible folders are used instead).&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedContactData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed contact data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 223 ||  || uid         || String || Can only be written when the object is created. Internal and external globally unique identifier of the contact. Is used to recognize contacts within vCard files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 500 || Display name                || display_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 501 || Given name                  || first_name           || String || First name.&lt;br /&gt;
|-&lt;br /&gt;
| 502 || Sur name                    || last_name            || String || Last name.&lt;br /&gt;
|-&lt;br /&gt;
| 503 || Middle name                 || second_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 504 || Suffix                      || suffix               || String&lt;br /&gt;
|-&lt;br /&gt;
| 505 || Title                       || title                || String&lt;br /&gt;
|-&lt;br /&gt;
| 506 || Street home                 || street_home          || String&lt;br /&gt;
|-&lt;br /&gt;
| 507 || Postal code home            || postal_code_home || String&lt;br /&gt;
|-&lt;br /&gt;
| 508 || City home                   || city_home            || String&lt;br /&gt;
|-&lt;br /&gt;
| 509 || State home                  || state_home           || String&lt;br /&gt;
|-&lt;br /&gt;
| 510 || Country home                || country_home         || String&lt;br /&gt;
|-&lt;br /&gt;
| 511 || Birthday                    || birthday             || Date&lt;br /&gt;
|-&lt;br /&gt;
| 512 || Marital status              || marital_status || String&lt;br /&gt;
|-&lt;br /&gt;
| 513 || Number of children          || number_of_children || String&lt;br /&gt;
|-&lt;br /&gt;
| 514 || Profession                  || profession           || String&lt;br /&gt;
|-&lt;br /&gt;
| 515 || Nickname                    || nickname             || String&lt;br /&gt;
|-&lt;br /&gt;
| 516 || Spouse name                 || spouse_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 517 || Anniversary                 || anniversary          || Date&lt;br /&gt;
|-&lt;br /&gt;
| 518 || Note                        || note                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 519 || Department                  || department           || String&lt;br /&gt;
|-&lt;br /&gt;
| 520 || Position                    || position             || String&lt;br /&gt;
|-&lt;br /&gt;
| 521 || Employee type               || employee_type  || String&lt;br /&gt;
|-&lt;br /&gt;
| 522 || Room number                 || room_number || String&lt;br /&gt;
|-&lt;br /&gt;
| 523 || Street business             || street_business      || String&lt;br /&gt;
|-&lt;br /&gt;
| 524 || Internal user id            || user_id || Number&lt;br /&gt;
|-&lt;br /&gt;
| 525 || Postal code business        || postal_code_business || String&lt;br /&gt;
|-&lt;br /&gt;
| 526 || City business               || city_business        || String&lt;br /&gt;
|-&lt;br /&gt;
| 527 || State business              || state_business       || String&lt;br /&gt;
|-&lt;br /&gt;
| 528 || Country business            || country_business     || String&lt;br /&gt;
|-&lt;br /&gt;
| 529 || Number of employee          || number_of_employees || String&lt;br /&gt;
|-&lt;br /&gt;
| 530 || Sales volume                || sales_volume || String&lt;br /&gt;
|-&lt;br /&gt;
| 531 || Tax id                      || tax_id               || String&lt;br /&gt;
|-&lt;br /&gt;
| 532 || Commercial register         || commercial_register  || String&lt;br /&gt;
|-&lt;br /&gt;
| 533 || Branches                    || branches             || String&lt;br /&gt;
|-&lt;br /&gt;
| 534 || Business category           || business_category    || String&lt;br /&gt;
|-&lt;br /&gt;
| 535 || Info                        || info                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 536 || Manager's name              || manager_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 537 || Assistant's name            || assistant_name       || String&lt;br /&gt;
|-&lt;br /&gt;
| 538 || Street other                || street_other         || String&lt;br /&gt;
|-&lt;br /&gt;
| 539 || City other                  || city_other           || String&lt;br /&gt;
|-&lt;br /&gt;
| 540 || Postal code other           || postal_code_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 541 || Country other               || country_other        || String&lt;br /&gt;
|-&lt;br /&gt;
| 542 || Telephone business 1        || telephone_business1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 543 || Telephone business 2        || telephone_business2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 544 || FAX business                || fax_business         || String&lt;br /&gt;
|-&lt;br /&gt;
| 545 || Telephone callback          || telephone_callback   || String&lt;br /&gt;
|-&lt;br /&gt;
| 546 || Telephone car               || telephone_car        || String&lt;br /&gt;
|-&lt;br /&gt;
| 547 || Telephone company           || telephone_company    || String&lt;br /&gt;
|-&lt;br /&gt;
| 548 || Telephone home 1            || telephone_home1      || String&lt;br /&gt;
|-&lt;br /&gt;
| 549 || Telephone home 2            || telephone_home2      || String&lt;br /&gt;
|-&lt;br /&gt;
| 550 || FAX home                    || fax_home             || String&lt;br /&gt;
|-&lt;br /&gt;
| 551 || Cellular telephone 1        || cellular_telephone1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 552 || Cellular telephone 2        || cellular_telephone2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 553 || Telephone other             || telephone_other      || String&lt;br /&gt;
|-&lt;br /&gt;
| 554 || FAX other                   || fax_other            || String&lt;br /&gt;
|-&lt;br /&gt;
| 555 || Email 1                     || email1               || String&lt;br /&gt;
|-&lt;br /&gt;
| 556 || Email 2                     || email2               || String&lt;br /&gt;
|-&lt;br /&gt;
| 557 || Email 3                     || email3               || String&lt;br /&gt;
|-&lt;br /&gt;
| 558 || URL                         || url                  || String&lt;br /&gt;
|-&lt;br /&gt;
| 559 || Telephone ISDN              || telephone_isdn       || String&lt;br /&gt;
|-&lt;br /&gt;
| 560 || Telephone pager             || telephone_pager      || String&lt;br /&gt;
|-&lt;br /&gt;
| 561 || Telephone primary           || telephone_primary    || String&lt;br /&gt;
|-&lt;br /&gt;
| 562 || Telephone radio             || telephone_radio      || String&lt;br /&gt;
|-&lt;br /&gt;
| 563 || Telephone telex             || telephone_telex      || String&lt;br /&gt;
|-&lt;br /&gt;
| 564 || Telephone TTY/TDD           || telephone_ttytdd     || String&lt;br /&gt;
|-&lt;br /&gt;
| 565 || Instantmessenger 1          || instant_messenger1   || String&lt;br /&gt;
|-&lt;br /&gt;
| 566 || Instantmessenger 2          || instant_messenger2   || String&lt;br /&gt;
|-&lt;br /&gt;
| 567 || Telephone IP                || telephone_ip         || String&lt;br /&gt;
|-&lt;br /&gt;
| 568 || Telephone assistant         || telephone_assistant  || String&lt;br /&gt;
|-&lt;br /&gt;
| 569 || Company                     || company              || String&lt;br /&gt;
|-&lt;br /&gt;
| 570 ||                             || image1 || String&lt;br /&gt;
|-&lt;br /&gt;
| 571 || Dynamic Field 1             || userfield01 || String&lt;br /&gt;
|-&lt;br /&gt;
| 572 || Dynamic Field 2             || userfield02 || String&lt;br /&gt;
|-&lt;br /&gt;
| 573 || Dynamic Field 3             || userfield03 || String&lt;br /&gt;
|-&lt;br /&gt;
| 574 || Dynamic Field 4             || userfield04 || String&lt;br /&gt;
|-&lt;br /&gt;
| 575 || Dynamic Field 5             || userfield05 || String&lt;br /&gt;
|-&lt;br /&gt;
| 576 || Dynamic Field 6             || userfield06 || String&lt;br /&gt;
|-&lt;br /&gt;
| 577 || Dynamic Field 7             || userfield07 || String&lt;br /&gt;
|-&lt;br /&gt;
| 578 || Dynamic Field 8             || userfield08 || String&lt;br /&gt;
|-&lt;br /&gt;
| 579 || Dynamic Field 9             || userfield09 || String&lt;br /&gt;
|-&lt;br /&gt;
| 580 || Dynamic Field 10            || userfield10 || String&lt;br /&gt;
|-&lt;br /&gt;
| 581 || Dynamic Field 11            || userfield11 || String&lt;br /&gt;
|-&lt;br /&gt;
| 582 || Dynamic Field 12            || userfield12 || String&lt;br /&gt;
|-&lt;br /&gt;
| 583 || Dynamic Field 13            || userfield13 || String&lt;br /&gt;
|-&lt;br /&gt;
| 584 || Dynamic Field 14            || userfield14 || String&lt;br /&gt;
|-&lt;br /&gt;
| 585 || Dynamic Field 15            || userfield15 || String&lt;br /&gt;
|-&lt;br /&gt;
| 586 || Dynamic Field 16            || userfield16 || String&lt;br /&gt;
|-&lt;br /&gt;
| 587 || Dynamic Field 17            || userfield17 || String&lt;br /&gt;
|-&lt;br /&gt;
| 588 || Dynamic Field 18            || userfield18 || String&lt;br /&gt;
|-&lt;br /&gt;
| 589 || Dynamic Field 19            || userfield19 || String&lt;br /&gt;
|-&lt;br /&gt;
| 590 || Dynamic Field 20            || userfield20 || String || Contains a UUID if one was assigned (after 6.18.2)&lt;br /&gt;
|-&lt;br /&gt;
| 592 ||                             || distribution_list    || Array  || If this contact is a distribution list, then this field is an array of objects. Each object describes a member of the list as defined in [[#DistributionListMember | Distribution list member]].&lt;br /&gt;
|-&lt;br /&gt;
| 594 || Number of distributionlists || number_of_distribution_list || Number&lt;br /&gt;
|-&lt;br /&gt;
| 596 ||                             || number_of_images || Number&lt;br /&gt;
|-&lt;br /&gt;
| 597 ||                             || image_last_modified || Timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 598 || State other                 || state_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 599 ||                             || file_as || String&lt;br /&gt;
|-&lt;br /&gt;
| 601 ||                             || image1_content_type || String&lt;br /&gt;
|-&lt;br /&gt;
| 602 ||                             || mark_as_distributionlist || Boolean&lt;br /&gt;
|-&lt;br /&gt;
| 605 || Default address             || default_address || Number&lt;br /&gt;
|-&lt;br /&gt;
| 606 ||                             || image1_url || String&lt;br /&gt;
|-&lt;br /&gt;
| 608 ||                             || useCount || Number || In case of sorting purposes the column 609 is also available, which places global address book contacts at the beginning of the result. If 609 is used, the order direction (ASC, DESC) is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 610 ||                             || yomiFirstName || String || Kana based representation for the First Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 611 ||                             || yomiLastName || String || Kana based representation for the Last Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 612 ||                             || yomiCompany || String || Kana based representation for the Company. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 613 ||                             || addressHome || String || Support for Outlook 'home' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 614 ||                             || addressBusiness || String || Support for Outlook 'business' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 615 ||                             || addressOther || String || Support for Outlook 'other' address field. (since 6.20.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DistributionListMember&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Distribution list member&lt;br /&gt;
! Name       !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id         || String || Object ID of the member's contact if the member is an existing contact.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Parent folder ID of the member's contact if the member is an existing contact (preliminary, from 6.22 on).&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| mail       || String || Email address (mandatory before 6.22, afterwards optional if you are referring to an internal contact)&lt;br /&gt;
|-&lt;br /&gt;
| mail_field || Number || Which email field of an existing contact (if any) is used for the mail field.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || independent contact&lt;br /&gt;
|-&lt;br /&gt;
| 1 || default email field (email1)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || second email field (email2)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || third email field (email3)&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects. Each object contains fields “id” and “folder” of requested contacts.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=listuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with id&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
Available with SP4&lt;br /&gt;
&lt;br /&gt;
=== Get updated contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested contacts.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted contacts. New and modified contacts are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted contacts (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a contact ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the contact's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Get contact by user ID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=getuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – User ID (not Object ID) of the requested user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. &lt;br /&gt;
&lt;br /&gt;
Available with SP4 package.&lt;br /&gt;
&lt;br /&gt;
=== Update a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder identifier through that the contact is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated contact. If the contact was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
To remove some contact image send the image attribute set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To change or add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File_uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Create a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created contact.&lt;br /&gt;
&lt;br /&gt;
To add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Delete contacts (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected contacts with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchContacts | Search contacts]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContacts&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find contacts. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves. Matching is performed against any substring of the field &amp;lt;code&amp;gt;display_name&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search contacts with the given startletter. If this field is present, the pattern is matched against the contact field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Array of Number || If a list of folder identifiers or at least a single folder identifier is given, only in that folders will be searched for contacts. This paramenter is optional but searching in all contact folders that are viewable and where objects can be read in is more expensive on that database than searching in a dedicated number of them. The possibility to provide here an array of folder identifier has been added with 6.10.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchContactsAlternative | Search contacts alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContactsAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches contacts where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches contacts where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches contacts where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| email1 || String || Searches contacts where the email1 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email2 || String || Searches contacts where the email2 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email3 || String || Searches contacts where the email3 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| company || String || Searches contacts where the company match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| categories || String || Searches contacts where the categories match with the given search pattern. &lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, a contact is returned if any specified pattern matches at the start of the corresponding field. Otherwise, a contact is returned if all specified patterns match any substring of the corresponding field.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed as if orSearch were set to true. The actual value of orSearch is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| exactMatch || Boolean || If set to true, contacts are returned where the specified patterns match the corresponding fields exactly. Otherwise, a 'startsWith' or 'substring' comparison is used based on the 'orSearch' parameter. (requires version &amp;gt; 6.22.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by filter (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=advancedSearch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#Module_.22search.22_.28alternative_suggestion.2C_still_preliminary.29 | Search Filter]]&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by anniversary (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose anniversary falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=anniversaries&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their anniversary in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by birthday (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose birthday falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=birthdays&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their birthday in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Auto-complete contacts (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts based on a prefix, usually used to auto-complete e-mail recipients while the user is typing.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; – The query to search for.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; (optional)  – Whether to only include contacts with at least one e-mail address. Defaults to &amp;quot;true&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. Since 7.8.1: If this parameter is missing, response is sorted by a user-specific use count of contacts, ID of contacts' parent folder and display name.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is &lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;calendar&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The calendar module is used to access calendar data.&lt;br /&gt;
&lt;br /&gt;
=== Get all appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) – Object ID of the folder, whose contents are queried. If not specified, defaults to all calendar folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which start on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which end before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Appointment sequencies are broken up into individual appointments and each occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed appointment data&lt;br /&gt;
! ID  !! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 206 || recurrence_id            || Number       || Object ID of the entire appointment sequence. Present on series and change exception appointments. Equals to object identifier on series appointment and is different to object identifier on change exceptions.&lt;br /&gt;
|-&lt;br /&gt;
| 207 || recurrence_position      || Number       || 1-based position of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 208 || recurrence_date_position || Date         || Date of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 210 || change_exceptions                     || Array       || An array of Dates, representing all change exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 211 || delete_exceptions                     || Array       || An array of Dates, representing all delete exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 400 || location    || String  || Location&lt;br /&gt;
|-&lt;br /&gt;
| 402 || shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 408 || timezone    || String  || Timezone&lt;br /&gt;
|-&lt;br /&gt;
| 410 || recurrence_start    || Date  || Start of a sequence without time&lt;br /&gt;
|-&lt;br /&gt;
|  || ignore_conflicts || Boolean  || Ignore soft conflicts for the new or modified appointment. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get appointment information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=has&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response is an array of booleans. Array length is the number of days. Each entry in the array corresponds with one day in the range that was queried, explaining whether there is an appointment on this day or not.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with full object IDs (folder, id and optionally either recurrence_position or recurrence_date_position) of requested appointments.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an appointment&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| pos  || Number || Value of the field recurrence_position, if present in the appointment.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get updated appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried. That parameter may be absent in case &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is set to &amp;quot;deleted&amp;quot;, which means all accessible calendar folders are considered. If  &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is not set to &amp;quot;deleted&amp;quot;, that parameter is mandatory.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested appointments.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted appointments. New and modified appointments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted appointments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by objects described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]] instead of arrays. Appointment sequencies are broken up into individual appointments and each modified occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
=== Get an appointment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_position&amp;lt;/code&amp;gt; (optional) – Recurrence Position requested appointment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested appointment. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the appointment's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated appointment. If the appointment was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field recurrence_id is always present if it is present in the original appointment. The field recurrence_position is present if it is present in the original appointment and only this single appointment should be modified. The field id is not present because it is already included as a parameter. Other fields are present only if modified.&lt;br /&gt;
&lt;br /&gt;
=== Create an appointment ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: If the appointment was created successfully, an object with the attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created appointment. If the appointment could not be created due to conflicts, the response body is an object with the field &amp;lt;code&amp;gt;conflicts&amp;lt;/code&amp;gt;, which is an array of appointment objects which caused the conflict. Each appointment object which represents a resource conflict contains an additional field &amp;lt;code&amp;gt;hard_conflict&amp;lt;/code&amp;gt; with the Boolean value true. If the user does not have read access to a conflicting appointment, only the fields &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;end_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shown_as&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; are present and the field &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; contains only the participants which caused the conflict.&lt;br /&gt;
&lt;br /&gt;
=== Delete an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: The appointment object to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Delete appointments (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of appointment objects to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Confirm appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the appointment to confirm.&lt;br /&gt;
* &amp;lt;code&amp;gt;occurrence&amp;lt;/code&amp;gt; – The numeric identifier of the occurrence to which the confirmation applies (in case &amp;quot;id&amp;quot; denotes a series appointment). Available with v7.6.0&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through which the appointment is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirmed appointment.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot;, &amp;quot;confirmmessage&amp;quot; and &amp;quot;id&amp;quot; (optional) as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Free &amp;amp; Busy ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - Internal user id. Must be obtained from the contact module.&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; - Constant for user or resource (1 for users, 3 for resources)&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which lie between start and end as described.&amp;lt;br&amp;gt;&lt;br /&gt;
This objects consist of:&lt;br /&gt;
{| id=&amp;quot;FreeAndBusyAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| start_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|- &lt;br /&gt;
| end_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Folder ID. Only set, if the user has the right to see the object. (added 2009-08-18/6.12) &lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean || True if the appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Search appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchAppointments&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search appointments&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find appointments. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search appointments with the given starting letter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get new appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=newappointments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; – limits the number of returned object to the given value.&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Resolve UID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=resolveuid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The UID to be resolved.&lt;br /&gt;
&lt;br /&gt;
Response: An object object with the field &amp;quot;id&amp;quot; containing the ox-object id, if existing, an error message otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Get all Change Exceptions (Since v7.2.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=getChangeExceptions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object id of the appointment series.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointments. &lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The mail module is used to access mail data.&lt;br /&gt;
&lt;br /&gt;
When mails are stored on an IMAP server, some functionality is not available due to restrictions of the IMAP protocol. Such functionality is marked with &amp;quot;not IMAP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get mail count ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=count&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder whose mail count is queried&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An integer value representing folder's mail count&lt;br /&gt;
&lt;br /&gt;
=== Get all mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedMailData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed mail data&lt;br /&gt;
! ID  !! Name                 !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 102 || color_label || Number || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive).&lt;br /&gt;
|-&lt;br /&gt;
| 600 || id                   || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 601 || folder_id            || String  || Object ID of the parent folder&lt;br /&gt;
|-&lt;br /&gt;
| 602 || attachment           || Boolean || Specifies whether this mail has attachments.&lt;br /&gt;
|-&lt;br /&gt;
| 603 || from                 || Array   || Each element is a two-element array specifying one sender. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values.&lt;br /&gt;
|-&lt;br /&gt;
| 604 || to                   || Array   || Each element is a two-element array (see the from field) specifying one receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 605 || cc                   || Array   || Each element is a two-element array (see the from field) specifying one carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 606 || bcc                  || Array   || Each element is a two-element array (see the from field) specifying one blind carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 607 || subject              || String  || Subject line.&lt;br /&gt;
|-&lt;br /&gt;
| 608 || size                 || Number  || Size of the mail in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 609 || sent_date            || Time    || Date and time as specified in the mail by the sending client.&lt;br /&gt;
|-&lt;br /&gt;
| 610 || received_date        || Time    || Date and time as measured by the receiving server.&lt;br /&gt;
|-&lt;br /&gt;
| 611 || flags                || Number  || Various system flags. A sum of zero or more of following values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || answered&lt;br /&gt;
|-&lt;br /&gt;
| 2  || deleted&lt;br /&gt;
|-&lt;br /&gt;
| 4  || draft&lt;br /&gt;
|-&lt;br /&gt;
| 8  || flagged&lt;br /&gt;
|-&lt;br /&gt;
| 16 || recent&lt;br /&gt;
|-&lt;br /&gt;
| 32 || seen&lt;br /&gt;
|-&lt;br /&gt;
| 64 || user&lt;br /&gt;
|-&lt;br /&gt;
| 128 || spam&lt;br /&gt;
|-&lt;br /&gt;
| 256 || forwarded&lt;br /&gt;
|}&lt;br /&gt;
See javax.mail.Flags.Flag for details.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || level                || Number  || Zero-based nesting level in a thread.&lt;br /&gt;
|-&lt;br /&gt;
| 613 || disp_notification_to || String  || Content of message's header “Disposition-Notification-To”&lt;br /&gt;
|-&lt;br /&gt;
| 614 || priority             || Number  || Value of message's “X-Priority” header:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0   || No priority&lt;br /&gt;
|-&lt;br /&gt;
| 5   || Very Low&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Low&lt;br /&gt;
|-&lt;br /&gt;
| 3   || Normal&lt;br /&gt;
|-&lt;br /&gt;
| 2   || High&lt;br /&gt;
|-&lt;br /&gt;
| 1   || Very High&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 615  || msg_ref                 || String  || Message reference on reply/forward.&lt;br /&gt;
|-&lt;br /&gt;
| 651  || flag_seen                 || String  || Special field to sort mails by seen status&lt;br /&gt;
|-&lt;br /&gt;
| 652  || account_name                 || String  || Message's account name.&lt;br /&gt;
|-&lt;br /&gt;
| 653  || account_id                 || int  || Message's account identifier. Since v6.20.2&lt;br /&gt;
|-&lt;br /&gt;
|     || user                 || Array  || An array with user-defined flags as strings.&lt;br /&gt;
|-&lt;br /&gt;
|     || headers                 || Object  || An object with a field for every non-standard header. The header name is the field name. The header value is the value of the field as string.&lt;br /&gt;
|-&lt;br /&gt;
|     || attachments          || Array   || Each element is an attachment as described in [[#Attachment | Attachment]]. The first element is the mail text. If the mail has multiple representations (multipart-alternative), then the alternatives are placed after the mail text and have the field disp set to alternative.&lt;br /&gt;
|-&lt;br /&gt;
|     || nested_msgs          || Array   || Each element is a mail object as described in this table, except for fields id, folder_id and attachment.&lt;br /&gt;
|-&lt;br /&gt;
|     || truncated          || boolean   || true/false if the mail content was trimmed. Since v7.6.1&lt;br /&gt;
|-&lt;br /&gt;
|     || source             || String    || RFC822 source of the mail. Only present for &amp;lt;tt&amp;gt;action=get&amp;amp;attach_src=true&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|     || cid                || String    || The value of the &amp;quot;Content-ID&amp;quot; header, if the header is present.&lt;br /&gt;
|-&lt;br /&gt;
| 654  || original_id                 || String  || The original mail identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|-&lt;br /&gt;
| 655  || original_folder_id                 || String  || The original folder identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Attachment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || String || Object ID (unique only inside the same message)&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || MIME type&lt;br /&gt;
|-&lt;br /&gt;
| content      || String || Content as text. Present only if easily convertible to text.&lt;br /&gt;
|-&lt;br /&gt;
| filename     || String || Displayed filename (mutually exclusive with content).&lt;br /&gt;
|-&lt;br /&gt;
| size         || Number || Size of the attachment in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| disp         || String || Attachment's disposition: null, inline, attachment or alternative.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all mail conversations (since v7.x) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=threadedAll&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;includeSent&amp;lt;/code&amp;gt; - A boolean value to signal that conversations also include messages taken from special &amp;quot;sent&amp;quot; aka &amp;quot;sent items&amp;quot; folder&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON array consisting of JSON objects, each representing a conversation's root message along with its message thread. The root message's JSON object is filled according to specified columns and is enhanced by special &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field representing the full message thread (including the root message itself). The &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field is a JSON array of JSON objects; each representing a message in the conversation sorted by time-line, also filled with specified columns. E.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
   &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
   &amp;quot;unreadCount&amp;quot;:0,&lt;br /&gt;
   &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
   &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
   &amp;quot;thread&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263853&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;26323&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/Sent&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263854&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Search mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON array of JSON objects each containing the search field and its search pattern: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;col&amp;quot;: 612, &amp;quot;pattern&amp;quot;: &amp;quot;Joe&amp;quot;}, {&amp;quot;col&amp;quot;: 614, &amp;quot;pattern&amp;quot;: &amp;quot;Tuesday&amp;quot;}]&amp;lt;/code&amp;gt; Supported values for &amp;lt;code&amp;gt;col&amp;lt;/code&amp;gt; are 603 to 607 (from, to, cc, bcc and subject) and -1 for full text search.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;headers&amp;lt;/code&amp;gt; - (preliminary) A comma-separated list of header names. Each name requests denoted header from each mail&lt;br /&gt;
&lt;br /&gt;
Request body: An array with one object for each requested mail. Each object contains the fields &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter followed by requested headers.&lt;br /&gt;
&lt;br /&gt;
=== Copy mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the copied mail&lt;br /&gt;
&lt;br /&gt;
=== Move mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the moved mail&lt;br /&gt;
&lt;br /&gt;
=== Update mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
'''Note''': If neither parameter &amp;quot;&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&amp;quot; nor parameter &amp;quot;&amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt;&amp;quot; is specified, all folder's messages are updated accordingly. Available with v6.20.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object which carries the new values that ought to be applied to mail as described in [[#UpdateMail | Update mail]] or [[#UpdateMailExtended | Update mail extended]] (available with SP6 v6.10).&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the Object ID of the updated mail and its folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMail&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| color_label || Number || The color number between 0 and 10.&lt;br /&gt;
|-&lt;br /&gt;
| flags || Number || A set of flags to add or remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| value || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to add the flags specified by &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (logical OR), &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to remove them (logical AND with the inverted value).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMailExtended&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail extended (available with SP6 v6.10)&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| set_flags || Number || A set of flags to add. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| clear_flags || Number || A set of flags to remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mark all mails as seen (available with v7.6.0) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=all_seen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: n.a.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Not IMAP: Get updated mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Just an empty JSON array is going to be returned since this action cannot be applied to IMAP.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the mail's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; (optional) – 1 indicates that this request should fill the message compose dialog to edit a message and thus display-specific date is going to be withheld.&lt;br /&gt;
* &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain only the (formatted) message headers as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain the complete message source as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; (optional) – 1 to write the complete message source to output stream. '''NOTE:''' This parameter will only be used if parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; is set to 1.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP4)&lt;br /&gt;
** &amp;quot;raw&amp;quot; returns the content as it is, meaning no preparation are performed and thus no guarantee for safe contents is given (available with SP6 v6.10).&lt;br /&gt;
** &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML.&lt;br /&gt;
** &amp;quot;textNoHtmlAttach&amp;quot; is the same as &amp;quot;text&amp;quot;, but does not deliver the HTML part as attachment in case of multipart/alternative content.&lt;br /&gt;
** &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).&lt;br /&gt;
** &amp;quot;noimg&amp;quot; to allow a possible HTML content being transferred but without original image src attributes which references external images: Can be used to prevent loading external linked images (spam privacy protection).&lt;br /&gt;
** '''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;unseen&amp;lt;/code&amp;gt; (optional) – &amp;quot;1&amp;quot; or &amp;quot;true&amp;quot; to leave an unseen mail as unseen although its content is requested&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
* &amp;lt;code&amp;gt;attach_src&amp;lt;/code&amp;gt; (optional - available since v7.6.1) 1 to let the JSON mail representation being extended by &amp;lt;code&amp;gt;&amp;quot;source&amp;quot;&amp;lt;/code&amp;gt; field containing the mail raw RFC822 source data&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included. '''NOTE:''' Of course response is not a JSON object if either parameter &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; or parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; are set to &amp;quot;1&amp;quot;. Then the response contains plain text. Moreover if optional parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to &amp;quot;1&amp;quot; the complete message source is going to be directly written to output stream to open browser's save dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mails as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_messages&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; –  A comma-separated list of Object IDs of the requested mails&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=attachment&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – ID of the requested attachment '''OR'''&lt;br /&gt;
* &amp;lt;code&amp;gt;cid&amp;lt;/code&amp;gt; – Value of header 'Content-ID' of the requested attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; – 1 overwrites the defined mimetype for this attachment to force the download dialog, otherwise 0.&lt;br /&gt;
* &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt; (optional) – 1 to apply HTML white-list filter rules if and only if requested attachment is of MIME type &amp;lt;code&amp;gt;text/htm*&amp;lt;/code&amp;gt; '''AND''' parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to 0.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this attachment, except the parameter save is set to 1.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mail attachments as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachments.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – A comma-separated list of IDs of the requested attachments&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Send a mail ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;lineWrapAfter&amp;lt;/code&amp;gt; – An integer value specifying the line-wrap setting (only effective for plain-text content); if absent the setting is taken from user's mail settings. Available with v7.8.1.&lt;br /&gt;
&lt;br /&gt;
Request Body: This method uses the encoding multipart/form-data or multipart/mixed.&lt;br /&gt;
* The form filed &amp;lt;code&amp;gt;json_0&amp;lt;/code&amp;gt; contains the rudimentary mail as JSON object as described in [[#DetailedMailData | Detailed mail data]] with just its message body (as html content) defined in nested JSON array &amp;quot;attachments&amp;quot; and its header data (from, to, subject, etc.). The field &amp;quot;content_type&amp;quot; defines whether the mail ought to be sent as plain text (&amp;quot;text/plain&amp;quot;), as html (&amp;quot;text/html&amp;quot;) or  as multipart/alternative (&amp;quot;ALTERNATIVE&amp;quot;). Sending a mail requires some special fields inside JSON mail object. The field &amp;quot;infostore_ids&amp;quot; defines a JSON array of infostore document ID(s) that ought to be appended to this mail as attachments. The field &amp;quot;msgref&amp;quot; indicates the ID of the referenced original mail. Moreover the field &amp;quot;sendtype&amp;quot; indicates the type of the message:&lt;br /&gt;
** 0 - A normal new mail (optional)&lt;br /&gt;
** 1 - A reply mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 2 - A forward mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 3 - A draft edit operation. The field &amp;quot;msgref&amp;quot; must be present in order to delete previous draft message since e.g. IMAP does not support changing/replacing a message but requires a delete-and-insert sequence&lt;br /&gt;
** 4 - Transport of a draft mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 6 - This type signals that user intends to send out a saved draft message and expects the draft message (referenced by &amp;quot;msgref&amp;quot; field) being deleted after successful transport&lt;br /&gt;
Example of a normal new mail which appends user's VCard and requests a read receipt from receiver:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Content-Disposition: form-data; name=&amp;quot;json_0&amp;quot;....{&amp;quot;from&amp;quot;:&amp;quot;\u0022Muster, Karl\u0022 &amp;lt;karl.muster@somewhere.com&amp;gt;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;someone@somewhere.com&amp;quot;,&amp;quot;cc&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bcc&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;subject&amp;quot;:&amp;quot;Mail Subject&amp;quot;,&amp;quot;priority&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;disp_notification_to&amp;quot;:true,&amp;quot;vcard&amp;quot;:1,&lt;br /&gt;
&amp;quot;attachments&amp;quot;:[{&amp;quot;content_type&amp;quot;:&amp;quot;ALTERNATIVE&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;Simple Mail Text!&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;\u000a\u000a&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* The request accepts file fields in upload form that denote referenced files that are going to be appended as attachments&lt;br /&gt;
* For &amp;quot;text/plain&amp;quot; mail bodies, the JSON boolean field &amp;quot;raw&amp;quot; may be specified inside the body's JSON representation to signal that the text content shall be kept as-is; meaning to keep all formatting intact&lt;br /&gt;
&lt;br /&gt;
==== Attach data sources ====&lt;br /&gt;
Moreover the JSON representation may contain data sources which should be appended as file attachments to the mail. Then the mail contains the &amp;lt;code&amp;gt;&amp;quot;datasources&amp;quot;&amp;lt;/code&amp;gt; key which is expected to be a JSON array of data source descriptions.&lt;br /&gt;
&lt;br /&gt;
A data source description follows the [[#Module_.22conversion.22_.28preliminary.29 | conversion specification]].&lt;br /&gt;
&lt;br /&gt;
For example to attach a file through an URL the field looks like this (available with v6.18.2):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;from&amp;quot;: &amp;quot;someone@somewhere.com,&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;quot;datasources&amp;quot;&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;identifier&amp;quot;: &amp;quot;com.openexchange.url.mail.attachment&amp;quot;,&lt;br /&gt;
   &amp;quot;args&amp;quot;:&lt;br /&gt;
    {&lt;br /&gt;
     &amp;quot;url&amp;quot;: &amp;lt;url-string&amp;gt;,&lt;br /&gt;
     &amp;quot;timeout&amp;quot;: &amp;lt;optional-timeout-millis-int, default is 2500msec&amp;gt;,&lt;br /&gt;
     &amp;quot;contentType&amp;quot;: &amp;lt;optional-content-type-string&amp;gt;,&lt;br /&gt;
     &amp;quot;charset&amp;quot;: &amp;lt;optional-charset-string&amp;gt;,&lt;br /&gt;
     &amp;quot;size&amp;quot;: &amp;lt;optional-size-int&amp;gt;,&lt;br /&gt;
     &amp;quot;disposition&amp;quot;: &amp;lt;optional-disposition-string&amp;gt;,&lt;br /&gt;
     &amp;quot;fileName&amp;quot;: &amp;lt;optional-file-name-string&amp;gt;,&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created mail.&lt;br /&gt;
&lt;br /&gt;
=== Send/Save mail as MIME data block (RFC822) (added in SP5) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) - In case the mail should not be sent out, but saved in a specific folder, the &amp;quot;folder&amp;quot; parameter can be used. If the mail should be sent out to the recipient, the &amp;quot;folder&amp;quot; parameter must not be included and the mail is stored in the folder &amp;quot;Sent Items&amp;quot;. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. If no &amp;quot;folder&amp;quot;  parameter is specified, this parameter must not be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
 &lt;br /&gt;
Request Body: The MIME Data Block&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created/moved mail.&lt;br /&gt;
&lt;br /&gt;
=== Import of mails as MIME data block (RFC822) (added with 6.18) ===&lt;br /&gt;
&lt;br /&gt;
This request can be used to store a single or a lot of mails in the OX mail storage backend. This action should be used instead of &amp;lt;code&amp;gt;action=new&amp;lt;/code&amp;gt; because it is faster and tolerant to 8bit encoded emails.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /ajax/mail?action=import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - For the import this parameter is required to specify the folder into that the emails should be imported. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
*&amp;lt;code&amp;gt;force&amp;lt;/code&amp;gt; (optional) - If this parameter is set to true, the server skips checking the valid From-address&lt;br /&gt;
 &lt;br /&gt;
Request Body: A multipart/form-data with a single or multiple file parts each having a different name and containing the RFC822 encoded email as binary data like in a file upload.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the folder identifier and the object identifier of the imported mail or a JSON array of those JSON objects if multiple mails are imported.&lt;br /&gt;
&lt;br /&gt;
=== Reply/Forward a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=forward&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested Message.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP6) - &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML. &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).'''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;setFrom&amp;lt;/code&amp;gt; (optional - available since v7.6.0) A flag (&amp;quot;true&amp;quot;/&amp;quot;false&amp;quot;) that signals if &amp;quot;From&amp;quot; header shall be pre-selected according to a suitable recipient address that matches one of user's E-Mail address aliases; only supported for &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included.&lt;br /&gt;
&lt;br /&gt;
=== Delete mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects providing folder IDs and object IDs of the deleted mails.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/INBOX&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;123&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/MyFolder&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;134&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not IMAP: Response: An array with object IDs of mails which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Clear mail folder(s) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=clear&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with IDs of the mail folders to clear&lt;br /&gt;
&lt;br /&gt;
Response: An array with IDs of mail folder that could not be cleared; meaning the response body is an empty JSON array if everything went well.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge receipt ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=receipt_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the &amp;quot;from address&amp;quot;, the id of the folder and the mail id: e.g.: {&amp;quot;from&amp;quot;:&amp;quot;mymail@domain.com&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;1234&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object with an empty data field if everything went well or a JSON object containing the error information.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;groups&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The group module allows to query available groups. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get a group ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The group id.&lt;br /&gt;
&lt;br /&gt;
Response: A group object as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== List groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with group identifiers.&lt;br /&gt;
&lt;br /&gt;
Response: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== Search for groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#GroupSearch | Group search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find groups. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group data&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name         || String || Name with character restrictions&lt;br /&gt;
|-&lt;br /&gt;
| members       || Array  || The array contains identifier of users that are member of the group.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created group.&lt;br /&gt;
&lt;br /&gt;
=== Delete a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the group to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the group.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the group was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the group to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the group to update. If the group was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested groups.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted groups. New, modified and deleted groups are represented by JSON objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;resource&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The resource module allows to query available resources. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get all resources ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource identifier.&lt;br /&gt;
&lt;br /&gt;
=== List resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An array with resources ids.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Get a resource ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The resource id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Search for resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#ParticipantSearch | Participant search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ParticipantSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find resources. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResourceResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Resource Response&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name || String || internal name&lt;br /&gt;
|-&lt;br /&gt;
| mailaddress || String || email address&lt;br /&gt;
|-&lt;br /&gt;
| availability || Boolean || can be false to mark the resource currently unavailable&lt;br /&gt;
|-&lt;br /&gt;
| description || String || description of the resource&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified_utc || Timestamp || Date and time of the last modification.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: An object with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created resource.&lt;br /&gt;
&lt;br /&gt;
=== Delete a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resource was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Delete resources (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resources were deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the resource to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the resource to update. If the resource was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested resources.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted resources. New, modified and deleted resources are represented by JSON objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;infostore&amp;quot; or &amp;quot;Filestore&amp;quot; or &amp;quot;Files&amp;quot; or &amp;quot;Drive&amp;quot; ==&lt;br /&gt;
This module has been renamed quite often. Whatever its name, it combines the knowledge database, bookmarks and document storage.&lt;br /&gt;
&lt;br /&gt;
=== Get all infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedInfoitemData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed infoitem data&lt;br /&gt;
! ID  !! Name            !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 108 || object_permissions           || Array  || Each element is an object described in [[#ObjectPermissionObject | Object Permission object]] (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 109 || shareable       || Boolean || (read-only) Indicates if the item can be shared (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 700 || title           || String  || Title&lt;br /&gt;
|-&lt;br /&gt;
| 701 || url             || String  || Link/URL&lt;br /&gt;
|-&lt;br /&gt;
| 702 || filename        || String  || Displayed filename of the document.&lt;br /&gt;
|-&lt;br /&gt;
| 703 || file_mimetype   || String  || MIME type of the document. The client converts known types to more readable names before displaying them.&lt;br /&gt;
|-&lt;br /&gt;
| 704 || file_size       || Number  || Size of the document in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 705 || version         || Number  || Version number of the document. New documents start at 1. Every update increments the version by 1.&lt;br /&gt;
|-&lt;br /&gt;
| 706 || description     || String  || Description&lt;br /&gt;
|-&lt;br /&gt;
| 707 || locked_until    || Time    || The time until which this item will presumably be locked. Only set if the docment is currently locked, 0 otherwise.&lt;br /&gt;
|-&lt;br /&gt;
| 708 || file_md5sum     || String  || MD5Sum of the document. Not yet implemented, so this is currently always empty.&lt;br /&gt;
|-&lt;br /&gt;
| 709 || version_comment || String  || A version comment is used to file a changelog for the file.&lt;br /&gt;
|-&lt;br /&gt;
| 710 || current_version || Boolean || “true” if this version is the current version “false” otherwise. Note: This is not writeable&lt;br /&gt;
|-&lt;br /&gt;
| 711 || number_of_versions || Number || The number of all versions of the infoitem. Note: This is not writeable.&lt;br /&gt;
|-&lt;br /&gt;
| 7010 || com.openexchange.share.extendedObjectPermissions || Array || Each element is an object described in [[#ExtendedObjectPermissionObject | Extended object permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 7020 || com.openexchange.realtime.resourceID || String || The resource identifier for the infoitem for usage within the realtime component. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies.&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user.&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended object permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || The numerical value indicating no object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || The numerical value indicating read object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || The numerical value indicating write object permissions. This implicitly includes the “read” permission (this is no bitmask).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of requested infoitems.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted infoitems. New and modified infoitems are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted infoitems (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested infoitem. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Search infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) – The folder ID to restrict the search to. If not specified, all folders are searched.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields as per tables [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; (optional) – The start index (inclusive) in the ordered search, that is requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; (optional) – The last index (inclusive) from the ordered search, that is requested.&lt;br /&gt;
&lt;br /&gt;
Request body: The search pattern string in a JSON object named &amp;quot;pattern&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem document ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt;(optional) – If present the response declares the given content_type in the Content-Type header.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem or the content_type given.&lt;br /&gt;
&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get a ZIP archive containing the infoitems of a denoted folder (available with v7.6.1) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=zipfolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;recursive&amp;lt;/code&amp;gt; – &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to also include subfolders and their infoitems respectively; otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to only consider the infoitems of specified folder&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP archive. The response type for the HTTP Request is set to &amp;lt;code&amp;gt;application/zip&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Get all versions ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=versions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem whose versions are requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. The timestamp is the timestamp relating to the requested infostore item.&lt;br /&gt;
&lt;br /&gt;
=== Check if file name is valid (since 7.8.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=checkname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – Name of the file to check.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object when file name is valid.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple documents as a ZIP archive (available with v7.4.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=zipdocuments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; – A URL-encoded JSON array; see below for details&lt;br /&gt;
&lt;br /&gt;
Parameter &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;: A JSON array of JSON object tuples specifying the documents' versions to include in the requested ZIP archive; e.g&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[{&amp;quot;id&amp;quot;:&amp;quot;61820&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;61821&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;}]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The field &amp;lt;code&amp;gt;&amp;quot;version&amp;quot;&amp;lt;/code&amp;gt; is optional; if missing it refers to latest/current version.&amp;lt;br&amp;gt;&lt;br /&gt;
So, a valid parameter would look like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;body=%5B%7B%22id%22%3A%2261820%22%2C%22folder%22%3A%2270303%22%7D%2C%7B%22id%22%3A%2261821%22%2C%22folder%22%3A%2270303%22%2C%22version%22%3A%221%22%7D%5D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The download offer for the requested ZIP archive containing specified document versions&lt;br /&gt;
&lt;br /&gt;
=== Move one or more infoitems via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=move&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the destination folder.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array consisting of JSON objects each referencing to an existing infoitem that is supposed to be moved to the destination folder&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36639&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;},&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36641&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array consisting of those identifiers that could not be moved (due to a conflict) or an empty JSON array if everything went fine&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; – Optionally sets the start offset in bytes where to append the data to the document, must be equal to the actual document's length (available with v7.8.1). Only available if the underlying [[#FileStorageAccount | File storage account]] supports the &amp;quot;RANDOM_FILE_ACCESS&amp;quot; capability.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem. The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Save an attachment in the infostore ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=saveAs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object with the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;Attachment&amp;lt;/code&amp;gt; – The id of the attachement to save.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. The fields in this infoitem object override values from the attachment. The folder_id must be given. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Delete infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the file is deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the file is not yet located below the trash folder, it is moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects to delete. The fields for the object are described in [[#FullIdentifierForAnInfostoreDocument|Full identifier for an infostore document]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with [[]]. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnInfostoreDocument&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an infostore document&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || Folder ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: A List of arrays with the version numbers of the infoitems to detach.&lt;br /&gt;
&lt;br /&gt;
Response: An array with version numbers that were not deleted.&lt;br /&gt;
&lt;br /&gt;
Note: When the current version of a document is deleted the new current version will be the newest version.&lt;br /&gt;
&lt;br /&gt;
=== Delete all versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=revert&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Removes all versions of the infostore document leaving only the base object.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
Response: The id of the newly created object&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Lock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=lock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be locked.&lt;br /&gt;
* &amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt; (optional) – If present the value is added to the current time on the server (both in ms). The document will be locked until that time. If this parameter is not present, the document will be locked for a duration as configured on the server.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only include errors.&lt;br /&gt;
&lt;br /&gt;
=== Unlock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=unlock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be unlocked.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only contain errors.&lt;br /&gt;
&lt;br /&gt;
=== Get shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared infoitem to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;Attachments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Attachment Module allows file attachments to arbitrary objects. An Attachment always belongs to an object (called 'attached') in a certain folder of a certain module.  &lt;br /&gt;
&lt;br /&gt;
=== Get All Attachments for an Object ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachment's are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of attachments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Create an Attachment ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/attachment?action=attach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json_[index]&amp;lt;/code&amp;gt; – The JSON representation of an attachment object as described in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;file_[index]&amp;lt;/code&amp;gt; – The file metadata as per &amp;lt;input type=file /&amp;gt; upload.&lt;br /&gt;
&lt;br /&gt;
Note: The JSON Object and file fields describe the corresponding attachment. For ex.: json_0 contains metadata for file_0, json_1 for file_1 and so on. Indexes start with 0.&lt;br /&gt;
&lt;br /&gt;
Request body: multipart/form-data or multipart/mixed containing the file data of the attached file and the above fields.&lt;br /&gt;
&lt;br /&gt;
Response: HTML page with javascript callback as per introduction. Contains a JSON-Array of ids of the newly created attachments. The order of the ids corresponds to the indexes in the request.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AttachmentObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment Object&lt;br /&gt;
! ID  !! Name          !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 800 || folder        || Number  || The ID of the first Folder in which the attached object resides.&lt;br /&gt;
|-&lt;br /&gt;
| 801 || attached      || Number  || The object id of the object this attachement is attached to.&lt;br /&gt;
|-&lt;br /&gt;
| 802 || module        || Number  || The Module of this Object Possible Values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1   || Appointment&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Task&lt;br /&gt;
|-&lt;br /&gt;
| 7   || Contact&lt;br /&gt;
|-&lt;br /&gt;
| 137 || Infostore&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 803 || filename      || String  || The filename of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 804 || file_size     || Number  || The file size (in bytes) of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 805 || file_mimetype || String  || The MIME-Type of the attached file&lt;br /&gt;
|-&lt;br /&gt;
| 806 || rft_flag      || Boolean || If the attachment is a RTF Attachment of Outlook. (Outlook descriptions can be stored as RTF Documents).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete Attachment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ids of the attachments to delete.&lt;br /&gt;
&lt;br /&gt;
=== Get updated attachments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
ignore (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new and deleted attachments for the specified object. New attachments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted attachments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain numbers, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attahment?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested attachment. The fields of the object are listed in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]]. &lt;br /&gt;
&lt;br /&gt;
=== Get an attachments filedata ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; (optional) – If set the responses Content-Type header is set to this value, not the attachements file mime type.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem.&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;reminder&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The reminder module provides the ability to fetch all active reminders for a user between two dates.&lt;br /&gt;
&lt;br /&gt;
=== Get reminder range ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/reminder?action=range&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The End date of the reminder range&lt;br /&gt;
&lt;br /&gt;
Response: An Array with all reminders which are scheduled until the specified time. Each reminder is described in [[#ReminderResponse | Reminder response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ReminderResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Reminder response&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The ID of the reminder.&lt;br /&gt;
|-&lt;br /&gt;
| target_id || Number || The target_id where this reminder is attached to&lt;br /&gt;
|-&lt;br /&gt;
| alarm     || Time   || The time of the alarm&lt;br /&gt;
|-&lt;br /&gt;
| module    || Number || The module of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| servertime || Time || The time on the server&lt;br /&gt;
|-&lt;br /&gt;
| user_id || Number || The ID of the user.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || The last modification timestamp of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| recurrence_position || Number || The recurrence position for series appointments or 0 if no series&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || The ID of the folder through that the object can be read&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete a Reminder===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the id that was not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete Reminders (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the ids that were not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Remind again (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=remindAgain&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the reminder whose date shall be changed.&lt;br /&gt;
&lt;br /&gt;
Request body: The JSON representation of the reminder; mainly containing the field “alarm” which provides the new reminder date.&amp;lt;br&amp;gt;&lt;br /&gt;
E.g. &amp;lt;code&amp;gt;{ &amp;quot;alarm&amp;quot;: 1283418027381 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response body: The JSON representation of the updated reminder.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;multiple&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The multiple module allows to bundle multiple requests to most other modules in a single request. Not supported are:&lt;br /&gt;
* modules login and multiple,&lt;br /&gt;
* POST requests with a multipart encoding (uploads),&lt;br /&gt;
* GET requests which do not use an object as described in [[#ResponseBody | Response body]] as response body (downloads).&lt;br /&gt;
&lt;br /&gt;
=== Multiple requests ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/multiple&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;continue&amp;lt;/code&amp;gt; – Specifies whether processing of requests should stop when an error occurs, or whether all request should be processed regardless of errors.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with request objects. Each request object contains all URI parameters of the &amp;quot;normal&amp;quot; request as fields. The module name of the &amp;quot;normal&amp;quot; request is included in the field module. The parameter session is not included. If the &amp;quot;normal&amp;quot; request has a request body, the object which is represented by that request body is includes as the value of the field data.&lt;br /&gt;
&lt;br /&gt;
Response: An array with reply objects as described in [[#ResponseBody | Response body]]. The order of reply objects corresponds to the order of requests in the request body. Unlike with all other modules, this response is itself not part of a response object as described in [[#ResponseBody | Response body]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;quota&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The filestore module allows accesssing information about the use and quota of the filestore.&lt;br /&gt;
&lt;br /&gt;
=== Get quota information (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; (optional) – The module identifier to get quota information for, required if &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; is set.&lt;br /&gt;
* &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; (optional) – The account identifier within the module to get quota information for.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the requested quota information. If no &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was specified, all defined [[#ModuleQuota | module quotas]] are set in the JSON object, each one mapped to it's module identifier. If the quota from a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was requested, a JSON array containing all [[#AccountQuota | account quotas]] of this module are returned. If both a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; were requested, a JSON object representing this specific [[#AccountQuota | account auota]] is returned. &lt;br /&gt;
&lt;br /&gt;
Note: In case there is no quota limitation defined for a module or account, no corresponding JSON object is included in the response. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ModuleQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Module Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || The display name of the module&lt;br /&gt;
|-&lt;br /&gt;
| accounts|| Array || Each element identifies an account quota within the module, as described in [[#AccountQuota | Account Quota]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AccountQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Account Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| account_id || String || Identifier of the account&lt;br /&gt;
|-&lt;br /&gt;
| account_name || String || Name of the account&lt;br /&gt;
|-&lt;br /&gt;
| countquota || Number || The account's quota limit for the number of items, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| countuse || Number || The account's actual usage for the number of items, or not set if no count quota defined&lt;br /&gt;
|-&lt;br /&gt;
| quota || Number || The account's quota limit for the storage in bytes, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The account's actual usage for the storage in bytes, or not set if no storage quota defined&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get the filestore usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=filestore&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the uploaded files sizes sum and the field “quota” represents the maximum.&lt;br /&gt;
&lt;br /&gt;
=== Get the mail usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the use mail quota and the field “quota” represents the maximum. -1 represents an unlimited quota.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;import&amp;quot;==&lt;br /&gt;
The module import allows to import specific module data (like Contacts, Tasks or Appointments) in several formats (iCal, vCard, CSV) into a folder. Please note: The callback for all actions of this bundle is callback_import, not callback_$actionname for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
=== Import CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: A &amp;quot;multipart/form-data&amp;quot; encoded .CSV file. The field name for the file is &amp;quot;file&amp;quot;. The column titles of the table are those used within the OX, see column ''Displayed Name'' in [[#DetailedContactData]].&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import Outlook CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=OUTLOOK_CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: An .CSV file with Windows' default encoding Windows-1252. The column titles of the table may be those used by the English, French or German version of Outlook.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import iCAL ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This may be an Appointment or a Task folder. May even be a list containing both.&lt;br /&gt;
* &amp;lt;code&amp;gt;suppressNotification&amp;lt;/code&amp;gt; – This optional parameter can be used to disable the notifications for new appointments that are imported through the given iCal file. This help keeping the Inbox clean if a lot of appointments need to be imported. The value of this parameter does not matter because only for the existence of the parameter is checked.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignoreUIDs&amp;lt;/code&amp;gt; – Optional. When set to &amp;quot;true&amp;quot;, UIDs are partially ignored during import of tasks and appointments from iCal. Internally, each UID is replaced statically by a random one to preserve possibly existing relations between recurring appointments in the same iCal file, but at the same time to avoid collisions with already existing tasks and appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An iCalendar file.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered, and warnings (under the key &amp;quot;warnings&amp;quot;) containing an Array of objects with the warning data, containing all customary error fields.&lt;br /&gt;
&lt;br /&gt;
=== Import vCard ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An vCard file, maybe of the formats: vCard 2.1, vCard 3.0 or vCalendar 1.0&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;export&amp;quot; ==&lt;br /&gt;
The module export allows to export specific module data (like Contacts, Tasks or Appointments) from a folder in several formats (iCal, vCard, CSV).&lt;br /&gt;
&lt;br /&gt;
=== Exporting CSV ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – (optional) Columns to be imported from the given file, given as an array of column numbers. See [[#DetailedContactData | Detailed contact data]] for numbers.&lt;br /&gt;
* &amp;lt;code&amp;gt;export_dlists&amp;lt;/code&amp;gt; – (optional) toggles whether distribution lists are exported, too. Default is false. Option exists since 7.4.1.&lt;br /&gt;
Response: An InputStream containing the file of the MIME type &amp;lt;code&amp;gt;text/csv&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting iCAL ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Calendar folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/calendar&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting vCard ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/x-vcard&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;sync&amp;quot; ==&lt;br /&gt;
The module sync delivers several core API extensions to support common operations used in a mobile synchronization environment.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/sync?action=refresh_server&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;token&amp;quot; (since 7.4.0) ==&lt;br /&gt;
The module token delivers several core API extensions to support token based logins.&lt;br /&gt;
&lt;br /&gt;
=== Get a login token ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/token?action=acquireToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON object with the timestamp of the creation date and a token which can be used to create a new session.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mailfilter&amp;quot; ==&lt;br /&gt;
The module mailfilter describes how to add, update or delete mail filter rules or to check which actions are supported by the underlying system.&lt;br /&gt;
&lt;br /&gt;
A detailed description can be found here [[ HTTP_API_MailFilter | Mail Filter HTTP API]]&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;ajax file upload&amp;quot; ==&lt;br /&gt;
This module offers to store files in server's dedicated download directory for a configureable amount of time. The files are then accessible for further operations like inline images in (html) mails&lt;br /&gt;
&lt;br /&gt;
=== Uploading a file ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/file?action=new&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The module for which the file is uploaded to determine proper upload quota constraints (e.g. &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;, etc.).&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; – The file type filter to define which file types are allowed during upload. Currently supported filters are: &amp;lt;code&amp;gt;file=all, text=text/*, media=image OR audio OR video, image=image/*, audio=audio/*, video=video/*, application=application/*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A common POST request body of MIME type &amp;quot;multipart/*&amp;quot; which holds the file(s) to upload&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of the uploaded files. The files are accessible through the returned IDs for future use.&lt;br /&gt;
&lt;br /&gt;
=== Updating a file's last access timestamp (keep alive) ===&lt;br /&gt;
By updating the last access timestamp it's prevented from being deleted from both session and disk storage.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=keepalive&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file whose timestamp should be updated&lt;br /&gt;
&lt;br /&gt;
Response: The string &amp;quot;null&amp;quot; in response's data element&lt;br /&gt;
&lt;br /&gt;
=== Requesting a formerly uploaded file ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested file is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;image&amp;quot; ==&lt;br /&gt;
This module allows to download images from Open-Xchange server without providing a session ID in request's URL parameters.&lt;br /&gt;
&lt;br /&gt;
=== Requesting an image ===&lt;br /&gt;
Open-Xchange Server supports multiple image sources that are identified through request's path identifier&lt;br /&gt;
&lt;br /&gt;
* Inline images from mails&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mail/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Contact profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/contact/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* User profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/user/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* MP3 cover image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/file/mp3cover&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Fetch a previously uploaded image using &amp;lt;code&amp;gt;&amp;quot;/ajax/file&amp;quot;&amp;lt;/code&amp;gt; interface&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mfile/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each image source requires an individual set of required parameters&lt;br /&gt;
&lt;br /&gt;
==== Inline images from mails ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/mail/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;accountId&amp;lt;/code&amp;gt; – The mail account identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the mail resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The mail identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the image inside the referenced mail&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Contact profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/contact/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the contact resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The contact identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== User profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/user/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The user identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MP3 cover image ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/file/mp3cover&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Managed Image File ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/image/mfile/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;conversion&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
A generic module to request data from a data source and to process obtained/submitted data with a data handler. Thus data is converted from a data source by a data handler.&lt;br /&gt;
&lt;br /&gt;
=== Converting data ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
or&amp;lt;br&amp;gt;&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters: &amp;amp;lt;no parameters required&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A [[#ConversionRequest | conversion request]] JSON object containing nested JSON objects for [[#DataSource | data source]] and [[#DataHandler | data handler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConversionRequest&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Conversion request object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| datasource || JSON object || The data source object.&lt;br /&gt;
|-&lt;br /&gt;
| datahandler || JSON object || The data handler object.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSource&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data source object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data source.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data source&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataHandler&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data handler object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data handler.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data handler&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: The result of converted data ready as an appropriate JSON response&lt;br /&gt;
&lt;br /&gt;
==== Saving an ICal email attachment ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can be saved as appointments and tasks into given calendar and task folder.&lt;br /&gt;
If the fields &amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;quot; and &amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;quot; are set, the data handler inserts the appointment with the given status for the user, if the appointment does not exist. If it is already existing, the handler just updates the participant status.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;calendar-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.task.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;task-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;status&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;message&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added appointment/task; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Converting an ICal email attachment into JSON objects ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can converted to JSON appointments and tasks.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Note''' that all arguments are optional: Default is user time zone and zero recurrence position&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;com.openexchange.groupware.calendar.searchobject&amp;quot; triggers a search for the uid, and replaces the object_id and folder_id with the data of the corresponding ox-object id, if existing. The returned objects are still the ical objects and NOT the ox-objects.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical.json&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.timezone&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;timezone-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.recurrencePosition&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;recurrence-position&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.searchobject&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;true|false&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects for each appointment/task as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]/[[##DetailedAppointmentData | Detailed appointment data]]&lt;br /&gt;
&lt;br /&gt;
==== Saving a VCard email attachment ====&lt;br /&gt;
&lt;br /&gt;
If a VCard file is attached to an email, its content can be saved as contacts into given contact folder.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.contact.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;contact-folder-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added contact; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contact(s) attached to a new email as a VCard file ====&lt;br /&gt;
&lt;br /&gt;
Obtain VCard data from specified contact object(s).&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-id1&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;id1&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-idn&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;idn&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Get a new email's JSON object with specified VCard data source attached.&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:[]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A [[#DetailedMailData | mail]] JSON object.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:{search-term-object}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&amp;lt;br&amp;gt;&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[...]}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moreover there are two different types of a search terms:&lt;br /&gt;
* A single search term&lt;br /&gt;
* A composite search term&lt;br /&gt;
&lt;br /&gt;
A single search term reflects an operation which cannot hold nested search terms as operands; e.g. &amp;quot;equals&amp;quot;. In opposite to this a composite search term holds one or more nested search terms as operands; e.g. &amp;quot;not&amp;quot; or the logical junctors &amp;quot;and&amp;quot;/&amp;quot;or&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
By now the following operations are supported:&lt;br /&gt;
* composite operations&lt;br /&gt;
** &amp;quot;and&amp;quot; - The AND junctor&lt;br /&gt;
** &amp;quot;or&amp;quot; - The OR junctor&lt;br /&gt;
** &amp;quot;not&amp;quot; - Negation&lt;br /&gt;
* single operations&lt;br /&gt;
** &amp;quot;equals&amp;quot; - Equals comparison&lt;br /&gt;
** &amp;quot;lt&amp;quot; - Less-than comparison&lt;br /&gt;
** &amp;quot;gt&amp;quot; - Greater-than comparison&lt;br /&gt;
&lt;br /&gt;
Furthermore following operand types are supported for single search terms:&lt;br /&gt;
* Column - Providing a name referring to a field/column&lt;br /&gt;
* Constant - A constant&lt;br /&gt;
&lt;br /&gt;
Example of an EQUALS search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of an OR search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;or&amp;quot;,&amp;quot;operands&amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;gt&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;birthday&amp;quot;},&amp;quot;1975-05-01&amp;quot;]}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Refer to object data tables introduced by different modules to know which field names are supported; e.g. for tasks it is [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]], and [[#DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (alternative suggestion, still preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:&amp;lt;i&amp;gt;[search term]&amp;lt;/i&amp;gt;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[&amp;quot;&amp;gt;&amp;quot;, 5, 2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The available operators are:&lt;br /&gt;
* Comparison operators &amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;=&amp;quot;, &amp;quot;&amp;lt;=&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
* logic operators &amp;quot;not&amp;quot;, &amp;quot;and&amp;quot;, &amp;quot;or&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Comparison operators have exactly two operands. Each operand can be either a field name or a constant. A field name is an object with the member &amp;quot;field&amp;quot; specifying the field name, e.g. &amp;lt;code&amp;gt;{ field: &amp;quot;first_name&amp;quot; }&amp;lt;/code&amp;gt;. The available field names depend on the searched module. Primitive JSON types are interpreted as constants. Arrays are not valid operands for comparison operators.&lt;br /&gt;
&lt;br /&gt;
The logic operator &amp;quot;not&amp;quot; has exactly one operand, the other logic operators can have any number of operands. Each operand must be an array representing a nested search expression.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail account&amp;quot; (available with v6.12) ==&lt;br /&gt;
&lt;br /&gt;
The mail account module is used to manage multiple mail accounts held by a user.&lt;br /&gt;
&lt;br /&gt;
=== Get All mail accounts  ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mail account's are defined in [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one mail account and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail account ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the account to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the desired mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MailAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Mail account data&lt;br /&gt;
! ID    !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  1001   || id            || Number  || Account ID&lt;br /&gt;
|-&lt;br /&gt;
|  1002   ||  login    || String  || The login.&lt;br /&gt;
|-&lt;br /&gt;
|  1003   ||  password   || String  || The (optional) password.&lt;br /&gt;
|-&lt;br /&gt;
|  1004   ||  mail_url || String    || The mail server URL; e.g. &amp;quot;imap://imap.somewhere.com:143&amp;quot;. '''URL is preferred over single fields''' (like mail_server, mail_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|  1005   ||  transport_url || String    || The transport server URL; e.g. &amp;quot;smtp://smtp.somewhere.com:25&amp;quot;. '''URL is preferred over single fields''' (like transport_server, transport_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|   1006  ||  name || String    || Account's display name.&lt;br /&gt;
|-&lt;br /&gt;
|  1007   ||  primary_address || String    || User's primary address in account; e.g. &amp;quot;someone@somewhere.com&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|  1008   ||  spam_handler || String    || The name of the spam handler used by account.&lt;br /&gt;
|-&lt;br /&gt;
|   1009  ||  trash || String    || The name of the default trash folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1010   ||  sent || String    || The name of the default sent folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1011  ||  drafts || String    || The name of the default drafts folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1012   ||  spam || String    || The name of the default spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1013   ||  confirmed_spam || String    || The name of the default confirmed-spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1014  || confirmed_ham || String    || The name of the default confirmed-ham folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1015  ||  mail_server || String    || The mail server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1016  ||  mail_port || Number    || The mail server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1017  ||  mail_protocol || String    || The mail server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;imap&amp;quot; instead of &amp;quot;imaps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1018  ||  mail_secure || Boolean    || Whether to establish a secure connection to mail server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1019  ||  transport_server || String    || The transport server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1020  ||  transport_port || Number    || The transport server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1021  ||  transport_protocol || String    || The transport server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;smtp&amp;quot; instead of &amp;quot;smtps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1022  ||  transport_secure || Boolean    || Whether to establish a secure connection to transport server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1023  ||  transport_login || String    || The transport login. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1024  ||  transport_password || String    || The transport password. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1025  ||  unified_inbox_enabled || Boolean    || If enabled for Unified INBOX&lt;br /&gt;
|-&lt;br /&gt;
|   1026  ||  trash_fullname || String    || Path to default trash folder. Preferred over &amp;quot;trash&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1027  ||  sent_fullname || String    || Path to default sent folder. Preferred over &amp;quot;sent&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1028  ||  drafts_fullname || String    || Path to default drafts folder. Preferred over &amp;quot;drafts&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1029  ||  spam_fullname || String    || Path to default spam folder. Preferred over &amp;quot;spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1030  ||  confirmed_spam_fullname || String    || Path to default confirmed-spam folder. Preferred over &amp;quot;confirmed_spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1031  ||  confirmed_ham_fullname || String    || Path to default confirmed-ham folder. Preferred over &amp;quot;confirmed_ham&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1032  ||  pop3_refresh_rate || Number    || The interval in minutes the POP3 account is refreshed&lt;br /&gt;
|-&lt;br /&gt;
|   1033  ||  pop3_expunge_on_quit || Boolean    || Whether POP3 messages shall be deleted on actual POP3 account after retrieval or not&lt;br /&gt;
|-&lt;br /&gt;
|   1034  ||  pop3_delete_write_through || Boolean    || If option &amp;quot;pop3_expunge_on_quit&amp;quot; is disabled, this property defines whether a delete in local INBOX also deletes affected message in actual POP3 account&lt;br /&gt;
|-&lt;br /&gt;
|   1035  ||  pop3_storage || String    || The name of POP3 storage provider, default is &amp;quot;mailaccount&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1036  ||  pop3_path || String    || Path to POP3's virtual root folder in storage, default is name of the POP3 account beside default folders&lt;br /&gt;
|-&lt;br /&gt;
|   1037  ||  personal || String    || The customizable personal part of email address&lt;br /&gt;
|-&lt;br /&gt;
|   1038  ||  reply_to || String    || The customizable reply-to email address&lt;br /&gt;
|-&lt;br /&gt;
|   1039  ||  addresses || String    || The comma-separated list of available E-Mail addresses including aliases. !! Only available for primary mail account !!&lt;br /&gt;
|-&lt;br /&gt;
|   1040  ||  meta || JSON data    || Stores arbitrary JSON data as specified by client associated with the mail account&lt;br /&gt;
|-&lt;br /&gt;
|   1041  ||  archive || String    || The name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1042  ||  archive_fullname || String    || The full name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1043  ||  transport_auth || String    || '''Available since v7.6.1''' Specifies the source for mail transport (SMTP) credentials. Possible values: &amp;quot;mail&amp;quot;, &amp;quot;custom&amp;quot;, and &amp;quot;none&amp;quot;.&amp;lt;br&amp;gt;- &amp;quot;mail&amp;quot; signals to use the same credentials as given in associated mail store (IMAP, POP3).&amp;lt;br&amp;gt;- &amp;quot;custom&amp;quot; signals that individual credentials are supposed to be used (fields &amp;quot;transport_login&amp;quot; and &amp;quot;transport_password&amp;quot; are considered).&amp;lt;br&amp;gt;- &amp;quot;none&amp;quot; means the mail transport does not support any authentication mechanism (rare case!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a new mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to create. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the inserted mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object identifiying (field ID is present) and describing the account to update. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the updated mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ID of the mail account to delete.&lt;br /&gt;
&lt;br /&gt;
=== Validate a mail account (which shall be created) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=validate&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; - An optional boolean parameter which indicates whether on successful validation the folder tree shall be returned (NULL on failure) or if set to &amp;quot;false&amp;quot; or missing only a boolean is returned which indicates validation result&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to validate. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: Dependent on optional &amp;quot;tree&amp;quot; parameter a JSON folder object or a boolean value indicating the validation result&lt;br /&gt;
&lt;br /&gt;
The JSON folder object corresponding to [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
Additionally a field &amp;quot;subfolder_array&amp;quot; is added which contains possible subfolders. This field is missing if a folder contains no subfolders.&lt;br /&gt;
&lt;br /&gt;
[[Category: OX6]]&lt;br /&gt;
&lt;br /&gt;
== Module Auto Configuration (since 6.22) ==&lt;br /&gt;
&lt;br /&gt;
=== Get Auto Configuration ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/autoconfig?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
application/x-www-form-urlencoded parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; – Email Adress for which a mail configuration will be discovered.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – Corresponding password for the mail account (optional)&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the best available settings for an appropriate mail Server for the given email address. The fields are described in [[#MailAccountData | mail account data]]. The Data may be incomplete or even empty.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user&amp;quot; (available with v6.14) ==&lt;br /&gt;
&lt;br /&gt;
The user module is used to access user information.&lt;br /&gt;
&lt;br /&gt;
=== Get all users ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedUserData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed user data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type       !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 610 || Aliases                     || aliases              || Array      || The user's aliases&lt;br /&gt;
|-&lt;br /&gt;
| 611 || Time zone                   || timezone             || String     || The time zone ID.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || Locale                      || locale               || String     || The name of user's entire locale, with the language, country and variant separated by underbars. E.g. &amp;quot;en&amp;quot;, &amp;quot;de_DE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 613 || Groups                      || groups               || Array      || The IDs of user's groups&lt;br /&gt;
|-&lt;br /&gt;
| 614 || Contact ID                  || contact_id           || Number     || The contact ID of the user&lt;br /&gt;
|-&lt;br /&gt;
| 615 || Login info                  || login_info           || String     || The user's login information&lt;br /&gt;
|-&lt;br /&gt;
| 616 || Guest Created By            || guest_created_by     || Number     || The ID of the user who has created this guest in case this user represents a guest user; it is 0 for regular users (preliminary, available with v7.8.0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of numbers. Each number is the ID of requested user. Since v6.18.1, a &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; value in the array is interpreted as the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a user ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested user. Since v6.18.1, this parameter is optional: the default is the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested user. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a user ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated user.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated user. If the user was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: User object as described in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
'''Note''': &amp;quot;timezone&amp;quot; and &amp;quot;locale&amp;quot; are the only fields from [[#DetailedUserData | Detailed user data]] which are allowed to be updated.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty object.&lt;br /&gt;
&lt;br /&gt;
=== Search users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected users with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchUsers | Search users]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsers&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find users. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search users with the given startletter. If this field is present, the pattern is matched against the user field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchUsersAlternative | Search users alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsersAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches users where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches users where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches users where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, the fields are connected through an OR search habit.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed by connecting the relevant fields through an OR search habit.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=getAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The attribute name. &lt;br /&gt;
&lt;br /&gt;
Response without timestamp: A JSON object providing name and value of the requested attribute&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=setAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;setIfAbsent&amp;lt;/code&amp;gt; - Set to &amp;quot;true&amp;quot; to put the value only if the specified name is not already associated with a value, otherwise &amp;quot;false&amp;quot; to put value in any case&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing name and value of the attribute. If the &amp;lt;code&amp;gt;&amp;quot;value&amp;quot;&amp;lt;/code&amp;gt; field id missing or NULL, the attribute is removed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if PUT was successful; otherwise &amp;quot;false&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user/me&amp;quot; (available with v7.6.2) ==&lt;br /&gt;
&lt;br /&gt;
The user/me module is used to access formal information about current user.&lt;br /&gt;
&lt;br /&gt;
=== Get user information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user/me&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object providing information for current user&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;context_id&amp;quot;: 1234,&lt;br /&gt;
        &amp;quot;user_id&amp;quot;: 5,&lt;br /&gt;
        &amp;quot;is_context_admin&amp;quot;: false,&lt;br /&gt;
        &amp;quot;login_name&amp;quot;: &amp;quot;user5&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;: &amp;quot;User Five&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: 1400855683800&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;OAuth&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Open-Xchange server can act as an OAuth client (starting with v6.20) or be an OAuth provider itself (starting with v7.8.0). The OAuth module supports both aspects:&lt;br /&gt;
&lt;br /&gt;
* Manage multiple OAuth accounts for certain online services for a user. The OAuth mechanism allows the Open-Xchange application to act as behalf of this user using previously obtained access tokens granted by user. The according interface is divided into two parts: Account access and service's meta data access.&lt;br /&gt;
* Manage granted accesses of external services that can access a users data on his behalf, called &amp;quot;grants&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== OAuth account access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service account access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth accounts ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The &amp;lt;b&amp;gt;optional&amp;lt;/b&amp;gt; service meta data identifier. If missing all accounts of all services are returned; otherwise all accounts of specified service are returned&lt;br /&gt;
&lt;br /&gt;
Response: An array with account data. Each array element is a JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
| serviceId     || String   || The identifier of the associated service meta data; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| secret || String || The token secret&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Delete an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Update an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier. May also be provided in request body's JSON OAuth account representation by &amp;lt;code&amp;gt;&amp;quot;id&amp;quot;&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the OAuth account fields to update. See [[#OauthAccountData | OAuth account data]]. Currently the only values which make sende being updated are &amp;lt;code&amp;gt;&amp;quot;displayName&amp;quot;&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;&amp;quot;token&amp;quot;&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;&amp;quot;secret&amp;quot;&amp;lt;/code&amp;gt;-pair.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Initialize creation of an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=init&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The service meta data identifier; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An JSON representation of the resulting interaction providing needed information to complete account creation. See [[#OauthInteractionData | OAuth interaction data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OauthInteractionData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth interaction&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| authUrl || String || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The interaction type name; &amp;lt;code&amp;gt;&amp;quot;outOfBand&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;callback&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| uuid || String || The UUID for this OAuth interaction&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Create an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
Note: This action is typically called by provided call-back URL and is ony intended for manual invocation if &amp;quot;outOfBand&amp;quot; interaction is returned by preceeding &amp;lt;code&amp;gt;/ajax/oauth/account?action=init&amp;lt;/code&amp;gt; step.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=create&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_token&amp;lt;/code&amp;gt; – The request token from preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; – The UUID of the preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_verfifier&amp;lt;/code&amp;gt; – The verifier string which confirms that user granted access&lt;br /&gt;
* &amp;lt;code&amp;gt;displayName&amp;lt;/code&amp;gt; – The display name for the new account&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing the newly created OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
=== OAuth service meta data access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service meta data access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth services' meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array with service data. Each array element is a JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth service's meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The service's identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthServiceMetaData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth service meta data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Manage OAuth grants (available with v7.8.0) ===&lt;br /&gt;
&lt;br /&gt;
==== Get all grants ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/grants?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing one object for every granted access as specified in [[#OAuthGrants | OAuth grants]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthGrants&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth grants&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| client || Object || A JSON object describing the external service as in [[#OAuthClient | OAuth client]].&lt;br /&gt;
|-&lt;br /&gt;
| scopes || Object || A JSON object with mappings from scope tokens to translated, human-readable descriptions for every scope that was granted to the external service. Example: {&amp;quot;read_contacts&amp;quot;:&amp;quot;See all your contacts.&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| date || Time || The time when the access was granted.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthClient&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth client&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The clients ID.&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The clients/services name.&lt;br /&gt;
|-&lt;br /&gt;
| description || String || A description of the client.&lt;br /&gt;
|-&lt;br /&gt;
| website || String || A URL to the clients website.&lt;br /&gt;
|-&lt;br /&gt;
| icon || String || A URL or path to obtain the clients icon via the &amp;quot;image&amp;quot; module.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Revoke access ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;oauth/grants?action=revoke&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - The ID of the client whose access shall be revoked.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;JSlob&amp;quot; (available with v6.22) ==&lt;br /&gt;
&lt;br /&gt;
The JSlob module is used to store&amp;amp;retrieve arbitrary JSON-structured configuration for a single user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all JSLobs ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jslob?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;JSlobData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | JSlob data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String or Number || The identifier of the JSlob.&lt;br /&gt;
|-&lt;br /&gt;
| jslob || JSON object || The JSON configuration.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== List denoted JSLobs ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array of JSlob identifiers; e.g. &amp;lt;code&amp;gt;[ &amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, … ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== Delete a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The JSlob identifier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An empty request body&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Store a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the &amp;quot;path&amp;quot; and &amp;quot;value&amp;quot; of the JSON configuration to store. If &amp;quot;path&amp;quot; is missing the current configuration&lt;br /&gt;
is merged with given JSON object.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Update a single value inside a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: The new value to store inside specified JSlob&lt;br /&gt;
&lt;br /&gt;
Response: A JSlob representation according to [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== REST-like access to JSlob module ===&lt;br /&gt;
&lt;br /&gt;
to be done...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;freebusy&amp;quot; (available with v6.22.1) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to free/busy information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get free/busy information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/freebusy?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;participant&amp;lt;/code&amp;gt; – The participant to get the free/busy data for. May be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Response: An array of free/busy intervals as described in [[#FreeBusyInterval | Free/Busy interval]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FreeBusyInterval&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Free/Busy interval&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| start_date  || Time       || Start time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| end_date    || Time       || End time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number     || The busy status of this interval, one of:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| id          || String     || Object ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id   || String     || Folder ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| title       || String     || Title of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| location    || String     || Location of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean    || True if the corresponding appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a list of free/busy information ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/freebusy?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of participants to get the free/busy data for. Each participant may be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
&lt;br /&gt;
Response: The free/busy data for all requested participants inside a JSON object with the participants as keys. Besides a combined data element for a requested group, all group members are resolved and listed seperately in the result. If the 'merged' view was requested, an additional data element named 'merged' representing a combined view for all requested participants is added to the results implicitly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Services ==&lt;br /&gt;
&lt;br /&gt;
Messaging Services represent a messaging backend. The messaging services add a new folder module &amp;quot;messaging&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
A *Messaging Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a messagingService. Usually a String in reverse domain name notation. Example: &amp;quot;com.openexchange.messaging.twitter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Twitter&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| formDescription || Array      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
| messagingActions || Array     || An array of Strings a dynamic set of actions that are possible with messages of this service. Described in detail later on. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of messaging service objects. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the messaging service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a messaging service object.&lt;br /&gt;
&lt;br /&gt;
== Messaging Accounts ==&lt;br /&gt;
&lt;br /&gt;
A messaging account represents the concrete configuration of an account of a given messaging service.&lt;br /&gt;
A *messaging account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number      || Identifies a given messaging account. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| messagingService || String  || The messaging service id of the messaging service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant messagingService &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;messagingService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* messagingService - (optional) list only those accounts that belong to the given messagingService.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Messages ==&lt;br /&gt;
&lt;br /&gt;
A Messaging Message represents a single message. It consists of some metadata, headers and a content. The content attribute varies by the content-type header. &lt;br /&gt;
If the content type is text/* it is a string, if it is a multipart/* it is an array of objects, each representing a part of the multipart. If it is anything else&lt;br /&gt;
it is considered binary and is a Base64 encoded string (ToDo : This is not smart enough yet. I suppose we'll have to include encoding options for binaries much like in our EAVJSONProposal).&lt;br /&gt;
&lt;br /&gt;
The folder id of a message follows a predefined format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[messagingService]://[accountId]/[path]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for an imaginary example consider: &amp;quot;com.openexchange.messaging.twitter://535/defaultTimeline/directMessages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The structure of a Messaging Message is as follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Message&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|id            ||String       || The id of this message. Only unique in the given folder. &lt;br /&gt;
|-&lt;br /&gt;
|folder        ||String       || The folder id. &lt;br /&gt;
|-&lt;br /&gt;
|threadLevel   ||Number       || The nesting level of this message according to the conversation it's belonged to. May not be set. &lt;br /&gt;
|-&lt;br /&gt;
|flags         ||Number       || Bitmask showing the state of this message. The same as in the module &amp;quot;mail&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|receivedDate  ||Time         || The time this message was received. &lt;br /&gt;
|-&lt;br /&gt;
|colorLabel    ||Number       || An arbitrary number marking this message in a certain color. The same as the colorLabel common to all groupware objects (see HTTP API)&lt;br /&gt;
|-&lt;br /&gt;
|user          ||Array        || An array of strings. Represents user flags. &lt;br /&gt;
|-&lt;br /&gt;
|size          ||Number       || The binary size of this message in bytes. &lt;br /&gt;
|-&lt;br /&gt;
|picture    || String       || A string depicting the URL to a picture for this message &lt;br /&gt;
|-&lt;br /&gt;
|url           || String      || A string that contains a link to the messages origin. Currently used in RSS messages.&lt;br /&gt;
|-&lt;br /&gt;
|headers       ||JSONObject   || A JSON Object of header data. Usually the value is either a String or an Array (if the headers has more than one value). Certain headers are rendered as more complex structures, see the section &amp;quot;Complex Headers&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|content       ||String or Array || See introductory note for Messaging Messages. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The structure of a Multipart Part (an element of the content array in a multipart/* message) is a s follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Multipart Element&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|sectionId     || String       || The sectionId of this part.&lt;br /&gt;
|-&lt;br /&gt;
|headers       || JSONObject   || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|content       || String or Array || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some *Complex Headers* have a structure differing from simple key/value(s) pairs. These are:&lt;br /&gt;
&lt;br /&gt;
=== Content-Type ===&lt;br /&gt;
&lt;br /&gt;
The Content-Type header is represented as a JSON Object with the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Content Type Header&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| type         || String          || The type string (eg. text/plain). This governs the rendering of the content of a message. &lt;br /&gt;
|-&lt;br /&gt;
| params       || Object          || An Object with the keys &amp;quot;charset&amp;quot;, containing the charset of this message and &amp;quot;name&amp;quot; pointing to the filename this part or message should have. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting the content-type header in a messaging messages generated on the client the header may also be sent in it's short form. The short form is the type followed by a semi-colon separated list of key=value pairs&lt;br /&gt;
of the params. For example: &amp;quot;text/plain;charset=utf-8;name=something.txt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Address Headers ===&lt;br /&gt;
&lt;br /&gt;
Address headers ( From, To,Cc,Bcc,Reply-To,Resent-Reply-To,Disposition-Notification-To,Resent-To,Sender,Resent-Sender,Resent-To,Resent-Cc,Resent-Bcc ) are formatted as an array of objects, or in case of &amp;quot;From&amp;quot; as a single object, with the attributes *address* and *personal*:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Address Headers&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| address         || String     || The technical part of the address&lt;br /&gt;
|-&lt;br /&gt;
| personal       || String      || A displayable description of the addressee. May be unset.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting an address header the header may also be sent by clients in the short form &amp;lt;code&amp;gt;&amp;quot;personal &amp;amp;lt;address&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;&amp;quot;Clark Kent &amp;amp;lt;clark.kent@dailyplanet.com&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== List renderings of Messaging Messages ===&lt;br /&gt;
&lt;br /&gt;
Actions returning lists of messages usually return only a selection of attributes of a message driven by a &amp;quot;columns&amp;quot; parameter. The columns that are addressable point either to attributes of the top-level message or its headers. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Header Equivalence&lt;br /&gt;
! Column     !! Refers To&lt;br /&gt;
|-&lt;br /&gt;
|   *column*    |     *refers to*     &lt;br /&gt;
|-&lt;br /&gt;
| id            || The id attribute    &lt;br /&gt;
|-&lt;br /&gt;
| folderId      || The folder attribute &lt;br /&gt;
|-&lt;br /&gt;
| contentType   || The &amp;quot;Content-Type&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| from          || The &amp;quot;From&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| to            || The &amp;quot;To&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| cc            || The &amp;quot;Cc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| bcc           || The &amp;quot;Bcc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| subject       || The &amp;quot;Subject&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| size          || The size attribute &lt;br /&gt;
|-&lt;br /&gt;
| sentDate      || The &amp;quot;Date&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| receivedDate  || The receivedDate attribute &lt;br /&gt;
|-&lt;br /&gt;
| flags         || The flags attribute &lt;br /&gt;
|-&lt;br /&gt;
| threadLevel   || The threadLevel attribute &lt;br /&gt;
|-&lt;br /&gt;
| dispositionNotificationTo || The &amp;quot;Disposition-Notification-To&amp;quot; header. &lt;br /&gt;
|-&lt;br /&gt;
| priority      || The &amp;quot;X-Priority&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| colorLabel    || The colorLabel attribute &lt;br /&gt;
|-&lt;br /&gt;
| url             || The url attribute &lt;br /&gt;
|-&lt;br /&gt;
| body          || The content attribute &lt;br /&gt;
|-&lt;br /&gt;
| headers       || The headers attribute &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== JSON calls ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* id - The ID of the message to load&lt;br /&gt;
* peek - (optional) if set to &amp;quot;true&amp;quot; the read/unread state of the message will not change. Defaults to false.&lt;br /&gt;
* folder - The folder id&lt;br /&gt;
   &lt;br /&gt;
Response: An Object representing the loaded message.&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/message?action=send&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* recipients - (optional) If set the message is sent to the given list of recipients, otherwise this defaults to the &amp;quot;To&amp;quot; header of the message.&lt;br /&gt;
   &lt;br /&gt;
Request Body: The Request Body should contain the JSON Object representing the message to be sent.&lt;br /&gt;
Response: &amp;quot;1&amp;quot; as the data of a regular response on success.&lt;br /&gt;
&lt;br /&gt;
GET or PUT /ajax/messaging/message?action=perform&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* action - The messaging action to invoke&lt;br /&gt;
* id - The id of the message the action should be invoked on. Only used on actions of type &amp;quot;storage&amp;quot;.&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
   &lt;br /&gt;
Request Body: On actions of type &amp;quot;message&amp;quot; the body should contain the JSON representation of the message the action should be applied to.&lt;br /&gt;
Response: Either 1 if no further user interaction is needed or a messaging message that, after having the user modify it has to be supplied back to the follower action of this action.&lt;br /&gt;
&lt;br /&gt;
Thus, to invoke a messaging action of type &amp;quot;storage&amp;quot; the folder and id are needed. Messaging actions of type &amp;quot;message&amp;quot; need a folder and message in the body. &lt;br /&gt;
Messaging actions of type &amp;quot;none&amp;quot; need a messaging message and account. &lt;br /&gt;
&lt;br /&gt;
==== List style requests ====&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
* sort - (optional) A column to sort by.&lt;br /&gt;
* order - (optional) The order direction. &amp;quot;asc&amp;quot; for ascending or &amp;quot;desc&amp;quot; for descending. Defaults to &amp;quot;asc&amp;quot;&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the the columns parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/messages?action=list&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
&lt;br /&gt;
Request Body: An array of arrays with the folder and id as elements each identifying a message. &lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Snippet module (available with v7.0.0/v6.22.0) ==&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=get&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The snippet's JSON representation; e.g.&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;signature&amp;quot;,&lt;br /&gt;
    &amp;quot;props&amp;quot;: {&amp;quot;x-custom&amp;quot;: &amp;quot;any value&amp;quot;},&lt;br /&gt;
    &amp;quot;module&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;displayname&amp;quot;: &amp;quot;My signature&amp;quot;,&lt;br /&gt;
    &amp;quot;misc&amp;quot;: {&amp;quot;foo&amp;quot;: &amp;quot;bar&amp;quot;},&lt;br /&gt;
    &amp;quot;createdby&amp;quot;: 17,&lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;-- \\nMy name and position here&amp;quot;,&lt;br /&gt;
    &amp;quot;accountid&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;shared&amp;quot;: false,&lt;br /&gt;
    &amp;quot;files&amp;quot;:&lt;br /&gt;
    [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;mimetype&amp;quot;: &amp;quot;image/png; name=pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;filename&amp;quot;: &amp;quot;pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;46f49f8a-40d5-4f29-8bc9-728f3420864c&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 6074&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Gets all snippets associated with the current user and context ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=all&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* type		- Optional CSV of types to filter by; e.g. &amp;quot;signature&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets certain snippets by identifiers ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=list&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of snippet identifiers&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet's attachment by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=getattachment&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
* attachmentid	- The attachment identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The attachment's raw data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Creates a new snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=new&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The created snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Updates a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=update&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet providing the fields that should be changed.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's JSON representation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Deletes a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=delete&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier (otherwise provide one or more identifiers through request body's JSON array)&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of identifiers denoting the snippets to delete&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
An empty/dummy result (don't care)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Attaches one or more files to an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
POST /ajax/snippet?action=attach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
Multipart form data providing the upload files to attach to the snippet.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Detaches open or more files from an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=detach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array providing the identifiers of the attachments to remove from snippet&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
== Module Halo ==&lt;br /&gt;
&lt;br /&gt;
=== Investigate contact ===&lt;br /&gt;
&lt;br /&gt;
PUT /appsuite/api/halo/contact?action=investigate&lt;br /&gt;
&lt;br /&gt;
The investigate action provides access to different halo providers. &lt;br /&gt;
Each provider requires an own set of parameters and also provides different results. &lt;br /&gt;
The following section describes some but not necessarily all of this providers.&lt;br /&gt;
Each request contains the following common parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; - The provider to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; - (optional) The timezone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to this parameters a contact must be defined. This can be done either with at least one of the following parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or within the request body.&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
&lt;br /&gt;
Instead of the contact parameters one can send a JSON object within the body of the request. This body describes the contact.&lt;br /&gt;
If used, it must contain at least one of the fields shown below. If the requests contains a body, the contact specific parameters are ignored. &lt;br /&gt;
It is also possible to provide more contact information. Empty fields are filled up with this values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSON object:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
	&amp;quot;contact_id&amp;quot;:12345&lt;br /&gt;
	&amp;quot;internal_userid&amp;quot;:12345&lt;br /&gt;
	&amp;quot;email1&amp;quot;: mail1@domain.com&lt;br /&gt;
	&amp;quot;email2&amp;quot;: mail2@domain2.com&lt;br /&gt;
	&amp;quot;email3&amp;quot;: mail3@domain3.com&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
The request responds with a JSON object. The content and structure of this object depends on the chosen provider. &lt;br /&gt;
In each case the response contains only data known to the server. Therefore some or all fields may be null.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.contacts &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
&lt;br /&gt;
A JSON array with the contact informations specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.appointments &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Requests parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - The start point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; - The end point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
	&lt;br /&gt;
A JSON array of appointments. Each appointment contains the fields specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.mail &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - The maximum number of mails within the result.&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
	&lt;br /&gt;
A JSON array of mails. Each mail contains the fields specified by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get halo services ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact?action=services&lt;br /&gt;
&lt;br /&gt;
Request parameter: &lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
 &lt;br /&gt;
A JSON object with a &amp;quot;data&amp;quot; field which contains an array of all available halo providers.&lt;br /&gt;
&lt;br /&gt;
=== Get contact picture ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact/picture&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - (optional) falls back to the public session cookie&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt; - (optional)  The internal user id of a user whose picture you want to load&lt;br /&gt;
* &amp;lt;code&amp;gt;userid&amp;lt;/code&amp;gt; - (optional) an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;user_id&amp;lt;/code&amp;gt; - (optional)  an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - (optional) a contact id&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; - (optional) an email to search for. Will pick global address book matches before regular matches. After that picks the most recently changed contact&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt; - (optional)  an alias for email&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt; - (optional) another email address to use to find matches&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt; - (optional) and yet another email address to use to find matches&lt;br /&gt;
&lt;br /&gt;
''At least one of the optional search parameters should be set. All parameters are connected by OR during the search. More specific parameters like user_id or id are prioritized in case of multiple matches.''&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The picture with proper eTag and caching headers set, or an HTTP Status 404 response, if no picture could be found.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;capabilities&amp;quot; (available with v7.4.2) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to capabilities, i.e. modules or features that are available on the backend and the user has access to.&lt;br /&gt;
&lt;br /&gt;
=== Get a capability ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the capability&lt;br /&gt;
&lt;br /&gt;
Response: The requested capability as described in [[#Capability| Capability]], if available, otherwise an empty result&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capability&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capability&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id  || String       || The identifier of the capability&lt;br /&gt;
|-&lt;br /&gt;
| attributes    || Object       || A JSON object holding optional properties of the capability &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all capabilities ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of capability objects as described in [[#Capability| Capability]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;jump&amp;quot; (available with v7.6.0) ==&lt;br /&gt;
&lt;br /&gt;
The jump module is used to pass an acquired identity token for an authenticated user from one system to another for a single sign-on.&lt;br /&gt;
&lt;br /&gt;
=== Acquire an identity token ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jump?action=identityToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; – The identifier for the external service/system&lt;br /&gt;
&lt;br /&gt;
Response: The acquired identity token wrapped by a simple JSON object as described in [[#Jump| Jump]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Jump&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Jump&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| token  || String       || The identifier of the token&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;find&amp;quot; (preliminary, available with v7.6.1) ==&lt;br /&gt;
The Find API consists of calls for performing searches within the modules mail, contacts, calendar, tasks and drive. It was designed to provide an iterative approach where the search criteria can be refined step-wise until the desired items are found. The starting point is always an &amp;quot;autocomplete&amp;quot; request, that suggests possible search filters based on a users input. Those filters are grouped into categories, called &amp;quot;facets&amp;quot;. A facet may provide one or more &amp;quot;values&amp;quot; with every value being a possible filter. A client is meant to remember every value that was selected by a user and include it within the following &amp;quot;autocomplete&amp;quot; and &amp;quot;query&amp;quot; requests, while &amp;quot;query&amp;quot; performs the actual search and returns the found items.&lt;br /&gt;
&lt;br /&gt;
Every request is bound to a module that must be specified via the URL-Parameter &amp;quot;module&amp;quot;. Possible modules are&lt;br /&gt;
* mail&lt;br /&gt;
* contacts&lt;br /&gt;
* calendar&lt;br /&gt;
* tasks&lt;br /&gt;
* drive&lt;br /&gt;
&lt;br /&gt;
=== General assumptions ===&lt;br /&gt;
Some of the objects returned by the server contain former user input. A client must never interpret  strings as HTML but always as plain text to be not vulnerable for CSS attacks!&lt;br /&gt;
&lt;br /&gt;
=== Calls ===&lt;br /&gt;
The find API provides two dedicated calls under the servlet path &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* action=query&lt;br /&gt;
&lt;br /&gt;
=== Facets ===&lt;br /&gt;
The style of a facet is responsible for how the according object is structured, how it is handled on the server-side and how the client has to handle it.&lt;br /&gt;
We distinguish three styles of facets:&lt;br /&gt;
* simple&lt;br /&gt;
* default&lt;br /&gt;
* exclusive&lt;br /&gt;
&lt;br /&gt;
Every facet value contains an embedded &amp;quot;filter&amp;quot; object. The filter must not be changed by the client, it has to be seen as a black-box. Instead the filters&lt;br /&gt;
of selected facet values have to be copied and sent to the server with the subsequent requests.&lt;br /&gt;
&lt;br /&gt;
==== Simple Facets ====&lt;br /&gt;
A simple facet is a special facet that has exactly one value. The facets&lt;br /&gt;
type and its value are strictly coupled, in a way that a display name for both,&lt;br /&gt;
facet and value would be redundant. A simple facet generally denotes a logical field like&lt;br /&gt;
'phone number'. Internally this logical field can map to several internal fields&lt;br /&gt;
(e.g. 'phone_private', 'phone_mobile', 'phone_business'). In clients the facet as&lt;br /&gt;
a whole can be displayed as a single item. Example: &amp;quot;Search for 'term' in field 'phone&lt;br /&gt;
number'&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;simple&amp;quot; || Denotes that this is a facet of style simple&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
    &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Default Facets ====&lt;br /&gt;
A default facet contains multiple values and may be present&lt;br /&gt;
multiple times in search requests to filter results by a combination of different&lt;br /&gt;
values (e.g. &amp;quot;mails with 'foo' and 'bar' in subject&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;default&amp;quot; || Denotes that this is a facet of style default&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| values || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
    &amp;quot;values&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
        &amp;quot;item&amp;quot;:{&lt;br /&gt;
          &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
          &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exclusive Facets ====&lt;br /&gt;
An exclusive facet is a facet where the contained values are&lt;br /&gt;
mutually exclusive. That means that the facet must only be present once&lt;br /&gt;
in an autocomplete or query request.&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;exclusive&amp;quot; || Denotes that this is a facet of style exclusive&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| options || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
    &amp;quot;options&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Active Facets ====&lt;br /&gt;
Every value that has been selected by a user must be remembered and provided with every subsequent request. The representation of a facet within a request body differs from the one within an autocomplete response. We call those &amp;quot;active facets&amp;quot;. Their representation is independent from their style.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Active Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Active Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| facet || &amp;lt;string&amp;gt; || The id of the according facet.&lt;br /&gt;
|-&lt;br /&gt;
| value || &amp;lt;string&amp;gt; || The id of the according value. Must always be copied from the value object, not from a possibly according option (in the two-dimensional case).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter object, copied from the value or option.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
According to the users configuration, some restrictions may apply that have to be heeded by clients. Those restrictions can be retrieved via the &amp;quot;config&amp;quot; or the &amp;quot;jslob&amp;quot; modules. The following restrictions may apply:&lt;br /&gt;
&lt;br /&gt;
* A user might have limited access to modules and therefore the Find API may only serve requests for a subset of all possible modules. The configuration object may contain an object with key &amp;quot;modules&amp;quot;. Its value is an array containing all module identifiers that the user is allowed to use. If the user is not allowed to search in any module, the value will be null.&lt;br /&gt;
&lt;br /&gt;
* Some facets can be mandatory, i.e. they must be pre-defined by the client and provided with every request. Whether a facet is mandatory or not is decided on a per-module basis. The configuration object may contain an object with key &amp;quot;mandatory&amp;quot;. Every facet that may be mandatory is specified via its id in that object (e.g. mandatory.folder). The value of such a key is either an array containing all module identifiers, where the facet is mandatory or null, if it is not manadatory in any module.&lt;br /&gt;
  &lt;br /&gt;
* Due to performance reasons the service provider can enforce a minimium number of characters that have to be provided before an autocomplete request may be issued. That property is called &amp;quot;minimumQueryLength&amp;quot; and its value is an integer that specifies the minimum number of characters. If a client does not heed this property, the server will respond with an error if the provided user input is too short.&lt;br /&gt;
&lt;br /&gt;
==== Config Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/config/search?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
            &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                &amp;quot;mail&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;modules&amp;quot;: [&lt;br /&gt;
            &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;contacts&amp;quot;,&lt;br /&gt;
            &amp;quot;calendar&amp;quot;,&lt;br /&gt;
            &amp;quot;tasks&amp;quot;,&lt;br /&gt;
            &amp;quot;drive&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GET http://localhost/appsuite/api/config/minimumSearchCharacters?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSLob Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/jslob?action=get&amp;amp;id=io.ox/core&amp;amp;session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;io.ox/core&amp;quot;,&lt;br /&gt;
        &amp;quot;tree&amp;quot;: {&lt;br /&gt;
            &amp;quot;search&amp;quot;: {&lt;br /&gt;
                &amp;quot;modules&amp;quot;: [&lt;br /&gt;
                    &amp;quot;mail&amp;quot;,&lt;br /&gt;
                    &amp;quot;contacts&amp;quot;,&lt;br /&gt;
                    &amp;quot;calendar&amp;quot;,&lt;br /&gt;
                    &amp;quot;tasks&amp;quot;,&lt;br /&gt;
                    &amp;quot;drive&amp;quot;&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
                    &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                        &amp;quot;mail&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;minimumQueryLength&amp;quot;: 0&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocomplete ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* limit=&amp;lt;int&amp;gt; - The maximum number of values returned per facet&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the users input (specified as &amp;quot;prefix&amp;quot;), already selected facets and possible options.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=autocomplete&amp;amp;module=mail&amp;amp;limit=3&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;prefix&amp;quot;:&amp;quot;test&amp;quot;,  &lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;facets&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },      &lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
        &amp;quot;values&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
            &amp;quot;item&amp;quot;:{&lt;br /&gt;
              &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
              &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;options&amp;quot;:[&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== query ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=query&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* columns=&amp;lt;column-ids&amp;gt; - A comma-separated list of the module-specific columns that shall be contained in the response items.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the selected facets and possible options. For pagination the keys &amp;quot;start&amp;quot; and &amp;quot;size&amp;quot; can be set.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=query&amp;amp;module=mail&amp;amp;columns=102,600,601,602,603,604,605,607,608,610,611,614,652&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:null&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;subject&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:1409579708116,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:{&lt;br /&gt;
        &amp;quot;fields&amp;quot;:[&lt;br /&gt;
          &amp;quot;subject&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;queries&amp;quot;:[&lt;br /&gt;
          &amp;quot;lorem&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start&amp;quot;:0,&lt;br /&gt;
  &amp;quot;size&amp;quot;:101&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;num_found&amp;quot;:-1,&lt;br /&gt;
    &amp;quot;start&amp;quot;:0,&lt;br /&gt;
    &amp;quot;size&amp;quot;:1,&lt;br /&gt;
    &amp;quot;results&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;110458&amp;quot;,&lt;br /&gt;
        &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
        &amp;quot;attachment&amp;quot;:false,&lt;br /&gt;
        &amp;quot;from&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;John Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;john.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;to&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;jane.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cc&amp;quot;:[&lt;br /&gt;
&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;subject&amp;quot;:&amp;quot;Lorem Ipsum&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;:7501,&lt;br /&gt;
        &amp;quot;received_date&amp;quot;:1408531387000,&lt;br /&gt;
        &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
        &amp;quot;priority&amp;quot;:3,&lt;br /&gt;
        &amp;quot;account_name&amp;quot;:&amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
        &amp;quot;account_id&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Available Options ===&lt;br /&gt;
Every request body may contain an &amp;quot;options&amp;quot; object to finetune some specific behavior. Currently possible options are:&lt;br /&gt;
* timezone: &amp;lt;tz-name&amp;gt; - The timezone to use if any dates are returned.&lt;br /&gt;
* admin: &amp;lt;boolean&amp;gt; - true to include the context admin if it matches any search criteria. If the context admin shall always be ignored (i.e. not returned), false has to be set.&lt;br /&gt;
&lt;br /&gt;
=== Possible Flags ===&lt;br /&gt;
Every facet may carry one or more flags that describe further aspects of that facet. Currently possible flags are:&lt;br /&gt;
* conflicts - Specified in the form of &amp;quot;conflicts:&amp;lt;other-id&amp;gt;&amp;quot;. A facet carrying this flag must not be combined with a facet of type &amp;lt;other-id&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;share/management&amp;quot; (preliminary, available with v7.8.0) ==&lt;br /&gt;
&lt;br /&gt;
Share links and can be created and managed via different actions in the &amp;quot;share/management&amp;quot; module. Additionally, there are dedicated actions to list all shares of a user in the modules [[#Get_shared_folders_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;folders&amp;quot;]] and [[#Get_shared_infoitems_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;files&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== Get a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Basic information about an already existing or newly created share link as described in [[#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Target&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| module || String || The folder's module name, i.e. one of &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| folder || String || The folder identifier &lt;br /&gt;
|-&lt;br /&gt;
| item   || String || (Optional) The object identifier, in case the share targets a single item &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareLink&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Link&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| url   || String  || The link to the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| entity   || Number  || The identifier of the anonymous user entity for the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| is_new   || Boolean  || Whether the share link is new, i.e. it has been created by the &amp;lt;tt&amp;gt;getLink&amp;lt;/tt&amp;gt;-request, or if it already existed  (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Time   ||  (Optional) The end date / expiration time after which the share link is no longer accessible.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || (Optional) An additional secret / pin number an anonymous user needs to enter when accessing the share&lt;br /&gt;
|-&lt;br /&gt;
| meta || JSON || (Optional) Arbitrary JSON data saved along with the share as specified by client &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Update a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The last modified timestamp of the link to be updated. Used to detect concurrent modifications.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in [[#ShareLink|Share Link]] containing the properties of the link to update., as well as the share target itself as described in [[#ShareTarget|Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Delete a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be deleted for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Send a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional message can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;drive&amp;quot; ==&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side. &lt;br /&gt;
&lt;br /&gt;
A detailed description can be found in a sepearet article: [[OX_Drive_API|OX Drive API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;passwordchange&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Users can change their password via the &amp;quot;passwordchange&amp;quot; module. &lt;br /&gt;
&lt;br /&gt;
=== Update password ===&lt;br /&gt;
&lt;br /&gt;
Note: The new password will be set without any checks. The client must ensure that it is the password the user wants to set. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/passwordchange?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in PasswordChange.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PasswordChange&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Password change&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| old_password || String || The users' current password or 'null' if the password wasn't set before (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
| new_password || String || The new password the user wants to set or 'null' to remove the password (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File Storage Services ==&lt;br /&gt;
&lt;br /&gt;
File storage services represents a file storage backend; e.g. Drive, Dropbox, etc.&lt;br /&gt;
&lt;br /&gt;
A *File Storage Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a file storage service. Example: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Box File Storage Service&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| configuration || JSON object      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileservice?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of file storage service objects. &lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileservice?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the file storage service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a file storage service object.&lt;br /&gt;
&lt;br /&gt;
== File Storage Accounts ==&lt;br /&gt;
&lt;br /&gt;
A file storage account represents the concrete configuration of an account of a given file storage service.&lt;br /&gt;
A *file storage account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageAccount&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || String      || Identifies a given file storage account in the scope of its file storage service (Infostore, Dropbox.com, Google OneDrive etc.). This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| filestorageService || String  || The identifier of the file storage service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| qualifiedId || String || Identifies a given file storage account globally, i.e. accross all file storage services. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| rootFolder || String || ID of the accounts root folder within the folder tree. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| isDefaultAccount || Boolean || Whether this account is the users default account. Exactly one account will have this flag set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant file storage service &lt;br /&gt;
|-&lt;br /&gt;
| capabilities || List of Strings || A list of capability names. Possible values are: &amp;quot;FILE_VERSIONS&amp;quot;, &amp;quot;EXTENDED_METADATA&amp;quot;, &amp;quot;RANDOM_FILE_ACCESS&amp;quot;, &amp;quot;LOCKS&amp;quot; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are&lt;br /&gt;
&lt;br /&gt;
=== Create a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;filestorageService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delete a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileaccount?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* filestorageService - (optional) list only those accounts that belong to the given file storage service.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example for creating a new OAuth-based file storage account ===&lt;br /&gt;
&lt;br /&gt;
First, get the description of the file storage service for which a new account is supposed to be created:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/fileservice?action=get&amp;amp;id=boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   {&lt;br /&gt;
    id: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
    displayName: &amp;quot;Box File Storage Service&amp;quot;&lt;br /&gt;
    configuration: {&lt;br /&gt;
      widget: &amp;quot;oauthAccount&amp;quot;&lt;br /&gt;
      options: {&lt;br /&gt;
        type: &amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      name: &amp;quot;account&amp;quot;&lt;br /&gt;
      displayName: &amp;quot;Select an existing account&amp;quot;&lt;br /&gt;
      mandatory: true&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next get the associated OAuth account information:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/oauth/accounts?action=all&amp;amp;serviceId=com.openexchange.oauth.boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;data&amp;quot;:[{&amp;quot;id&amp;quot;:333,&amp;quot;displayName&amp;quot;:&amp;quot;My Box.com account&amp;quot;,&amp;quot;serviceId&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;}]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create the file storage account:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  PUT /ajax/fileaccount?action=new&amp;amp;session=...&lt;br /&gt;
  &lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;filestorageService&amp;quot;:&amp;quot;boxcom&amp;quot;,&lt;br /&gt;
    &amp;quot;displayName&amp;quot;:&amp;quot;My box.com account&amp;quot;,&lt;br /&gt;
    &amp;quot;configuration&amp;quot;:{&lt;br /&gt;
      &amp;quot;account&amp;quot;:&amp;quot;333&amp;quot;,&lt;br /&gt;
      &amp;quot;type&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response provides the relative (in context of the according file storage service) identifier of the newly created account:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;data&amp;quot;:19}&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=21498</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=21498"/>
		<updated>2016-02-22T06:21:59Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: /* Distributed Session Storage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific cirumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stabilty for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests beloning to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page.&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a name and password needs to be defined. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
 # The password used when joining the cluster. Defaults to &amp;quot;wtV6$VQk8#+3ds!a&amp;quot;. &lt;br /&gt;
 # Please change this value, and ensure it's equal on all nodes in the cluster.&lt;br /&gt;
 com.openexchange.hazelcast.group.password=wtV6$VQk8#+3ds!a&lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the &lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes) or &amp;quot;multicast&amp;quot; (automatic &lt;br /&gt;
 # discovery of other nodes via multicast). Defaults to &amp;quot;empty&amp;quot;. Depending on &lt;br /&gt;
 # the specified value, further configuration might be needed, see &amp;quot;Networking&amp;quot;&lt;br /&gt;
 # section below. &lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as decribed in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.group.password=secret&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning (preliminary) ===&lt;br /&gt;
&lt;br /&gt;
While originally being desgined to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom paritioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom paritioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own paritioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom paritioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session mirgration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionaly a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed witht the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
== Upgrading a single Node ==&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
== Upgrades of the Hazelcast library ==&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''.&lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utitlty as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21496</id>
		<title>HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21496"/>
		<updated>2016-02-19T10:22:03Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: /* Search infoitems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This document defines the Open-Xchange HTTP API which is used by the new AJAX GUI. The first chapter describes general definitions and conventions which apply to all server modules. All other chapters describe individual server modules.&lt;br /&gt;
&lt;br /&gt;
=== Low level protocol ===&lt;br /&gt;
&lt;br /&gt;
The client accesses the server through HTTP GET, POST and PUT requests. HTTP cookies are used for authentication and must therefore be processed and sent back by the client as specified by [http://tools.ietf.org/html/rfc6265 RFC 6265]. The HTTP API is accessible at URIs starting with &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;. Each server module has a unique name and its own sub-namespace with that name below &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;, e. g. all access to the module &amp;quot;tasks&amp;quot; is via URIs starting with &amp;lt;code&amp;gt;/ajax/tasks&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Text encoding is always UTF-8. Data is sent from the server to the client as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; and interpreted by the client to obtain an ECMAScript object. The HTTP API uses only a small subset of the ECMAScript syntax. This subset is roughly described by the following BNF:&lt;br /&gt;
&lt;br /&gt;
 Value   ::= &amp;quot;null&amp;quot; | Boolean | Number | String | Array | Object&lt;br /&gt;
 Boolean ::= &amp;quot;true&amp;quot; | &amp;quot;false&amp;quot;&lt;br /&gt;
 Number  ::= see NumericLiteral in ECMA 262 3rd edition&lt;br /&gt;
 String  ::= \&amp;quot;([^&amp;quot;\n\\]|\\[&amp;quot;\n\\])*\&amp;quot;&lt;br /&gt;
 Array   ::= &amp;quot;[]&amp;quot; | &amp;quot;[&amp;quot; Value (&amp;quot;,&amp;quot; Value)* &amp;quot;]&amp;quot;&lt;br /&gt;
 Object  ::= &amp;quot;{}&amp;quot; | &amp;quot;{&amp;quot; Name &amp;quot;:&amp;quot; Value (&amp;quot;,&amp;quot; Name &amp;quot;:&amp;quot; Value)* &amp;quot;}&amp;quot;&lt;br /&gt;
 Name    ::= [A-Fa-f][0-9A-Fa-f_]*&lt;br /&gt;
&lt;br /&gt;
Numbers are the standard signed integer and floating point numbers. Strings can contain any character, except double quotes, newlines and backslashes, which must be escaped by a backslash. Control characters in strings (other than newline) are not supported. Whitespace is allowed between any two tokens. See [http://json.org JSON] and [http://www.ecma-international.org/publications/standards/Ecma-262.htm ECMA 262, 3&amp;lt;sup&amp;gt;rd&amp;lt;/sup&amp;gt; edition] for the formal definition.&lt;br /&gt;
&lt;br /&gt;
The response body consists of an object, which contains up to four fields as described in [[#ResponseBody | Response body]]. The field &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; contains the actual payload which is described in following chapters. The fields &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;error_params&amp;lt;/code&amp;gt; are present when data objects are returned, if an error occurred and if the error message contains conversion specifiers, respectively. Following sections describe the contents of these fields in more detail.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResponseBody&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Response body&lt;br /&gt;
! Name         !! Type      !! Value&lt;br /&gt;
|-&lt;br /&gt;
| data         || Value     || Payload of the response.&lt;br /&gt;
|-&lt;br /&gt;
| timestamp    || Timestamp || The latest timestamp of the returned data (see [[HTTP_API#Updates|Updates]]).&lt;br /&gt;
|-&lt;br /&gt;
| error        || String    || The translated error message. Present in case of errors.&lt;br /&gt;
|-&lt;br /&gt;
| error_params || Array     || As o 7.4.2: Empty JSON array. Before that: Parameters for the error message that would need to be replaced in the error string (in a printf-format style).&lt;br /&gt;
|-&lt;br /&gt;
| error_id     || String    || Unique error identifier to help finding this error instance in the server logs.&lt;br /&gt;
|-&lt;br /&gt;
| error_desc     || String    || The technical error message (always English) useful for debugging the problem. Might be the same as error message if there is no more information available&lt;br /&gt;
|-&lt;br /&gt;
| code         || String    || Error code consisting of an upper-case module identifier and a four-digit message number, separated by a dash; e.g. &amp;quot;MSG-0012&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| error_stack     || Array    || If configured (see &amp;quot;com.openexchange.ajax.response.includeStackTraceOnError&amp;quot; in 'server.properties') this field provides the stack trace of associated Java exception represented as a JSON array&lt;br /&gt;
|-&lt;br /&gt;
| categories     || String OR Array    || Either a single (String) or list (Array) of upper-case category identifiers to which the error belongs. E.g.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| &amp;quot;USER_INPUT&amp;quot;  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFIGURATION&amp;quot;  || An error related to user/system configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;PERMISSION_DENIED&amp;quot;  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRY_AGAIN&amp;quot;  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;SERVICE_DOWN&amp;quot;  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONNECTIVITY&amp;quot;  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;ERROR&amp;quot;  || A programming error which was caused by incorrect program code.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFLICT&amp;quot;  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CAPACITY&amp;quot; || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRUNCATED&amp;quot; || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;WARNING&amp;quot; || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| category     || Number    || Maintained for legacy reasons: The numeric representation of the first category:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| 2  || An error strictly related to user configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| 3  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| 5  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| 6  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| 8  || A programming error which was caused by incorrect programm code.&lt;br /&gt;
|-&lt;br /&gt;
| 9  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| 12 || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Data from the client to the server can be sent in several formats. Small amounts of data are sent as &amp;lt;code&amp;gt;application/x-www-urlencoded&amp;lt;/code&amp;gt; in query parameters in the request URI. For POST requests, some or all parameters may be sent in the request body instead of in the URI using any valid encoding for POST requests. Alternatively, some requests specify that data is sent as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; in the body of a PUT request. The format of the request body for PUT requests is the same as for sending data from the server to the client, except that the payload is sent directly, without being wrapped in another object.&lt;br /&gt;
&lt;br /&gt;
When updating existing data, the client sends only fields that were modified. To explicitly delete a field, the field is sent with the value &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. For fields of type &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, the empty string &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Error handling ===&lt;br /&gt;
&lt;br /&gt;
If the session of the user times out, if the client doesn't send a session ID or if the session for the specified session ID can not be found then the server returns the above described response object, that contains an error code and an error message. If the request URI or the request body is malformed or incomplete then the server returns the reponse object with an error message, too. In case of internal server errors, especially Java exceptions, or if the server is down, it returns the HTTP status code 503, Service Unavailable. Other severe errors may return other HTTP status values.&lt;br /&gt;
&lt;br /&gt;
Application errors, which can be caused by a user and are therefore expected during the operation of the groupware, are reported by setting the field error in the returned object, as described in [[#ResponseBody | Response body]]. Since the error messages are translated by the client, they can not be composed of multiple variable parts. Instead, the error message can contain simplified printf()-style conversion specifications, which are replaced by elements from the array in the field error_params. If error_params is not present, no replacement occurs, even if parts of the error message match the syntax of a conversion specification.&lt;br /&gt;
&lt;br /&gt;
A simplified conversion specification, as used for error messages, is either of the form %s or %''n''$s, where ''n'' is a 1-based decimal parameter index. The conversion specifications are replaced from left to right by elements from error_params, starting at the first element. %s is replaced by the current element and the current index is incremented. %''n''$s is replaced by the ''n''th element and the current index is set to the (''n'' + 1)th element.&lt;br /&gt;
&lt;br /&gt;
Some error message contain data sizes which must be expressed in Bytes or Kilobytes etc., depending on the actual value. Since the unit must be translated, this conversion is performed by the client. Unfortunately, standard printf()-style formatting does not have a specifier for this kind of translation. Therefore, the conversion specification for sizes is the same as for normal strings, and the client has to determine which parameters to translate based on the error code. The current error codes and the corresponding size parameters are listed in [[#DataSizeParameters | Data size parameters]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSizeParameters&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data size parameters&lt;br /&gt;
! Error code !! Parameter indices&lt;br /&gt;
|-&lt;br /&gt;
| CON-0101   || 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| FLS-0003   || 1, 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0065   || 1, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0066   || 1&lt;br /&gt;
|-&lt;br /&gt;
| NON-0005   || 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Date and time ===&lt;br /&gt;
&lt;br /&gt;
Dates without time are transmitted as the number of milliseconds between 00:00 UTC on that date and 1970-01-01 00:00 UTC. Leap seconds are ignored, therefore this number is always an integer multiple of 8.64e7.&lt;br /&gt;
&lt;br /&gt;
Because ECMAScript Date objects have no way to explicitly specify a timezone for calculations, timezone correction must be performed on the server. Dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''user's'' timezone and UTC at the time in question. (See the Java method java.util.TimeZone.getOffset(long)). Unless optional URL parameter &amp;lt;code&amp;gt;'''timezone'''&amp;lt;/code&amp;gt; is present. Then dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''specified'' timezone and UTC at the time in question.&lt;br /&gt;
&lt;br /&gt;
For some date and time values, especially timestamps, monotonicity is more important than the actual value. Such values are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC, ignoring leap seconds and without timezone correction. If possible, a unique strictly monotonic increasing value should be used instead, as it avoids some race conditions described below.&lt;br /&gt;
&lt;br /&gt;
This specification refers to these three interpretations of the type Number as separate data types. The types are described in [[#DateAndTimeTypes | Date and time types]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DateAndTimeTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Date and time types&lt;br /&gt;
! Type      !! Time !! Timezone !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| Date      || No   || UTC      || Date without time.&lt;br /&gt;
|-&lt;br /&gt;
| Time      || Yes  || User     || Date and time.&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || Yes  || UTC      || Timestamp or unique sequence number.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
&lt;br /&gt;
To allow efficient synchronization of a client with changes made by other clients and to detect conflicts, the server stores a timestamp of the last modification for each object. Whenever the server transmits data objects to the client, the response object described in [[#ResponseBody | Response body]] includes the field timestamp. This field contains a timestamp value which is computed as the maximum of the timestamps of all transmitted objects.&lt;br /&gt;
&lt;br /&gt;
When requesting updates to a previously retrieved set of objects, the client sends the last timestamp which belongs to that set of objects. The response contains all updates with timestamps greater than the one specified by the client. The field timestamp of the response contains the new maximum timestamp value.&lt;br /&gt;
&lt;br /&gt;
If multiple different objects may have the same timestamp values, then a race condition exists when an update is processed between two such objects being modified. The first, already modified object will be included in the update response and its timestamp will be the maximum timestamp value sent in the timestamp field of the response. If the second object is modified later but gets the same timestamp, the client will never see the update to that object because the next update request from the client supplies the same timestamp value, but only modifications with greater timestamp values are returned.&lt;br /&gt;
&lt;br /&gt;
If unique sequence numbers can't be used as timestamps, then the risk of the race condition can be at least minimized by storing timestamps in the most precise format and/or limiting update results to changes with timestamp values which are measurably smaller than the current timestamp value.&lt;br /&gt;
&lt;br /&gt;
=== Editing ===&lt;br /&gt;
&lt;br /&gt;
Editing objects is performed one object at a time. There may be multiple objects being edited by the same client simulataneously, but this is achieved by repeating the steps required for editing a single object. There is no batch edit or upload command.&lt;br /&gt;
&lt;br /&gt;
To edit an object, a client first requests the entire object from the server. The server response contains the timestamp field described in the previous section. For in-place editing inside a view of multiple objects, where only already retrieved fields can be changed, retrieving the entire object is not necessary, and the last timestamp of the view is used as the timestamp of each object in it.&lt;br /&gt;
&lt;br /&gt;
When sending the modified object back to the server, only modified fields need to be included in the sent object. The request also includes the timestamp of the edited object. The timestamp is used by the server to ensure that the object was not edited by another client in the meantime. If the current timestamp of the object is greater than the timestamp supplied by the client, then a conflict is detected and the field error is set in the response. Otherwise, the object gets a new timestamp and the response to the client is empty.&lt;br /&gt;
&lt;br /&gt;
If the client displays the edited object in a view together with other objects, then the client will need to perform an update of that view immediately after successfully uploading an edited object.&lt;br /&gt;
&lt;br /&gt;
=== File uploads ===&lt;br /&gt;
&lt;br /&gt;
File uploads are made by sending a POST request that submits both the file and the needed fields as parts of a request of content-type “multipart/form-data” or “multipart/mixed”. The file metadata are stored in a form field “file” (much like an &amp;lt;input type=”file” name=”file” /&amp;gt; would do). In general a call that allows file uploads via POST will have a corresponding call using PUT to send object data. The JSON-encoded object-data that is send as the body of a corresponding PUT call is, when performed as a POST with file uploads, put into the request parameter “json”.&lt;br /&gt;
&lt;br /&gt;
Since the upload is performed directly by the browser and is not an Ajax call, the normal callback mechanism for asynchronous Javascript calls cannot be used to obtain the result. For this reason the server responds to these POST calls with a complete HTML page that performs the callback and should not be displayed to the user. The HTML response is functionally equivalent to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
     &amp;lt;head&amp;gt;&lt;br /&gt;
         &amp;lt;META http-equiv=&amp;quot;Content-Type&amp;quot; content=\&amp;quot;text/html; charset=UTF-8\&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
             (parent[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;] || window.opener &amp;amp;&amp;amp; window.opener[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;])&lt;br /&gt;
             (&amp;lt;b&amp;gt;{json}&amp;lt;/b&amp;gt;)&lt;br /&gt;
         &amp;lt;/script&amp;gt;&lt;br /&gt;
     &amp;lt;/head&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The placeholders &amp;lt;code&amp;gt;{json}&amp;lt;/code&amp;gt; is replaced by the response with the timestamp that would be expected from the corresponding PUT method. The placeholder &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; is replaced by the value of the parameter &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; of the request (except for the import bundle, which is named &amp;quot;import&amp;quot; instead of the action name for legacy purposes). The content-type of the answer is &amp;lt;code&amp;gt;text/html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Non-browser clients don't need to interpret HTML or JavaScript. The JSON data can be recognized by the outermost &amp;lt;code&amp;gt;({&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;})&amp;lt;/code&amp;gt;, where the inner braces are part of the JSON value. For example, the regular expression &amp;lt;code&amp;gt;\((\{.*\})\)&amp;lt;/code&amp;gt; captures the entire JSON value in its first capturing group.&lt;br /&gt;
&lt;br /&gt;
=== Documentation conventions ===&lt;br /&gt;
&lt;br /&gt;
The rest of this document describes all available requests for each module. A module usually supports several different requests, which are differentiated by the used HTTP method, URI path and supplied URI parameters. The description of each method generally contains the following elements:&lt;br /&gt;
* the HTTP method followed by the request URI, inclusing the URI parameter action, which is used to differentiate methods,&lt;br /&gt;
* a list of URI parameters which can or must be supplied by the client,&lt;br /&gt;
* for PUT requests, content of the request body,&lt;br /&gt;
* for POST requests all described parameters are normally expected in the request body, exceptions are documented,&lt;br /&gt;
* &amp;quot;Response with timestamp:&amp;quot;if the timestamp field is required in the response body or simply &amp;quot;Response:&amp;quot; if not,&lt;br /&gt;
* content of the response payload, unless it is supposed to be empty.&lt;br /&gt;
&lt;br /&gt;
=== Common object data ===&lt;br /&gt;
&lt;br /&gt;
This table contains common fields which apply for any module's data type and is referenced throughout this document whenever a module's data type is described.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonObjectData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common object data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|-&lt;br /&gt;
| 100  || categories     || String  || String containing comma separated the categories. Order is preserved. Changing the order counts as modification of the object. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 101  || private_flag     || Boolean  || Overrides folder permissions in shared private folders: When true, this object is not visible to anyone except the owner. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 102  || color_label  || Number  || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive). Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 104  || number_of_attachments     || Number  || Number of attachments &lt;br /&gt;
|-&lt;br /&gt;
| 105 || lastModifiedOfNewestAttachmentUTC || Time || Date and time of the newest attachment written with UTC time zone.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;login&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The login module is used to obtain a session from the user's login credentials. To understand the details of the different login methods, see the article titled &amp;quot;[[Login variations]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Because of security reasons each login variation will reject requests containing the parameter &amp;quot;password&amp;quot; within the URL query (starting with 7.8.0).&lt;br /&gt;
&lt;br /&gt;
=== Login ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters are normally expected in the POST request body:&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password MUST be placed in the request body, otherwise the login request will be denied.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; (optional) – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method.&lt;br /&gt;
&lt;br /&gt;
=== Form Login (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=formlogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request implements a possible login to the web frontend by only using a simple HTML form. An example for such a form can be found in the backend's documentation folder (&amp;lt;code&amp;gt;/usr/share/doc/open-xchange-core&amp;lt;/code&amp;gt;) under &amp;lt;code&amp;gt;examples/login.html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client must be the same as the client sent by the UI in the normal login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI. The URL of the web UI is either taken from the given parameter or from the configured default of the backend.&lt;br /&gt;
&lt;br /&gt;
For a complete description of the FormLogin-Process please see [[FormLogin|this documentation]]&lt;br /&gt;
&lt;br /&gt;
=== Token Login (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokenLogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows every possible client to create a very short living session. This session can then be transferred to any other client preferably a browser entering then the normal web interface. Then the sessions life time will be extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Compared to the login mechanism using the random token, this request is more secure because two tokens are used. One of these tokens is only known to the client and one is generated by the server. Only the combination of both tokens allows to use the session. The combination of both tokens must be done by the client creating the session.&lt;br /&gt;
&lt;br /&gt;
DISCLAIMER: This request MUST NOT be used by some server side instance. If some server side instance uses this request to create a session for a browser on some client machine, then you have to transfer the full URL with server and client token over some connection to the client. This creates a VULNERABILITY if this is done. The token login method is only secure if this request is already sent from the same machine that later runs the browser using the created session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login information.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client should be the same as the client sent by the UI in the normal login request. For security considerations it can become necessary to define here the correct client that will use the session.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Version of the HTTP/JSON interface client. Only for statistic evaluations.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail. This must be enabled on the server and a client can test with the autologin request if it is enabled or not.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used. Currently the IP address may change when using the session with both tokens. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used. Currently the User-Agent may change when using the session. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;jsonResponse&amp;lt;/code&amp;gt; (optional, since 7.8.0) – true or false (default). Defines the returned data type as JSON. Default 'false' will return a redirect. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI (or JSON including the redirect url in case jsonResponse=true is set). The URL of the web UI is either taken from the given parameter or from the configured default of the backend. This redirect will only contain the server side token. The client side token sent in the request must be appended by the client creating the session. The final URL must have the form &amp;lt;code style=&amp;quot;white-space: nowrap&amp;quot;&amp;gt;&amp;lt;var&amp;gt;redirect_URL&amp;lt;/var&amp;gt;&amp;amp;amp;clientToken=&amp;lt;var&amp;gt;token&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;. Both tokens are necessary to use the session and both tokens must match. Otherwise the session is terminated.&lt;br /&gt;
&lt;br /&gt;
=== Tokens (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokens&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows clients to access a session created with the [[#Token_Login_.28since_7.0.1.29 | tokenLogin]] request. When accessing the session its life time is extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;serverToken&amp;lt;/code&amp;gt; – Server side identifier for accessing the session. This identifier was created by the server and is contained in the tokenLogin response.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. This identifier was created by the client and passed within the POST data of the tokenLogin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. Currently this request allows to change the client identifier for the session. This eases creating the session because the identifier of the client using the session must not be known. For security considerations it can become necessary to drop this parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object conform to the normal [[#ResponseBody | response body]] contrary to the JSON object of the normal login request. This JSON object contains the session identifier, the login, the identifier and the locale of the user.&lt;br /&gt;
&lt;br /&gt;
=== Logout ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=logout&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh secret cookie (since 6.18.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=refreshSecret&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh auto-login cookie ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=store&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Redirect ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login;jsessionid=1157370816112.OX1?action=redirect&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURITY WARNING!''' Utilizing this request is '''INSECURE'''! This request allows to access a session with a single one time token. This one time token may be delivered to the wrong client if the protocol has an error or Apache or the load balancer make a mistake. This will cause a wrong user to be in a wrong session. '''IMMEDIATELY''' consider not to use this request anymore. You have been warned. Use instead the FormLogin that does not need to use the redirect request.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;random&amp;lt;/code&amp;gt; – A session random token to jump into the session. This random token is part of the login response. Only a very short configurable time after the login it is allowed to jump into the session with the random token.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – The client can be defined here newly if it is not correct on the login request itself.&lt;br /&gt;
* &amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt; (optional) – Tells the UI to do a store request after login to be able to use autologin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – The optional path on the webserver to the UI. If this parameter is not given the configured uiWebPath is used.&lt;br /&gt;
&lt;br /&gt;
=== Change IP ===&lt;br /&gt;
&lt;br /&gt;
The following request is especially for integration with systems located in the providers infrastructure. If those systems create a session with the following request the client host IP address in the session can be changed. The IP check for following requests will be done using this newly set client host IP address.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=changeip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; – New IP address of the client host for the current session.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the string &amp;quot;1&amp;quot; as data attribute.&lt;br /&gt;
&lt;br /&gt;
=== Redeem Token (since 7.4.0)===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=redeemToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; – The token created with [[#Get_a_login_token | acquireToken]].&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request. &lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. The client must identifier must be the same for each request after creating the login session. &lt;br /&gt;
* &amp;lt;code&amp;gt;secret&amp;lt;/code&amp;gt; – The value of the secret string for token logins. This is configured through the tokenlogin-secrets configuration file.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method. If configured within tokenlogin-secrets configuration file even the user password will be returned.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;config&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The config module is used to retrieve and set user-specific configuration. The configuration is stored in a tree. Each node of the tree has a name and a value. The values of leaf nodes are strings which store the actual configuration data. The values of inner nodes are defined recursively as objects with one field for each child node. The name and the value of each field is the name and the value of the corresponding child node, respectively.&lt;br /&gt;
&lt;br /&gt;
The namespace looks like the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/ajax/config/&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; – A string containing GUI-specific settings (currently, it is a huge [[#Low_level_protocol | JSON]] object).&lt;br /&gt;
** &amp;lt;code&amp;gt;fastgui&amp;lt;/code&amp;gt; - A string containing GUI-specific settings. This is a JSON object that must be kept small for performance.&lt;br /&gt;
** &amp;lt;code&amp;gt;context_id&amp;lt;/code&amp;gt; - the unique identifier of the context (read-only, added 2008-01-28).&lt;br /&gt;
** &amp;lt;code&amp;gt;cookielifetime&amp;lt;/code&amp;gt; - the cookie life time in seconds or &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; for session cookie (read-only, added 2010-11-16).&lt;br /&gt;
** &amp;lt;code&amp;gt;identifier&amp;lt;/code&amp;gt; – the unique identifier of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;contact_id&amp;lt;/code&amp;gt; – the unique identifier of the contact data of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; – the configured language of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; – the configured timezone of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;availableTimeZones&amp;lt;/code&amp;gt; – a JSON object containing all available time zones. The key is the time zone identifier and the value contains its name in users language. (read-only, added 2010-07-08/v6.18).&lt;br /&gt;
** &amp;lt;code&amp;gt;calendarnotification&amp;lt;/code&amp;gt; - send a mail notification for appointments (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;tasknotification&amp;lt;/code&amp;gt; - send a mail notification for tasks (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;reloadTimes&amp;lt;/code&amp;gt; - Selectable times for GUI reload&lt;br /&gt;
** &amp;lt;code&amp;gt;serverVersion&amp;lt;/code&amp;gt; - Version string of the server.&lt;br /&gt;
** &amp;lt;code&amp;gt;currentTime&amp;lt;/code&amp;gt; - User timezone specific long of the current server time.&lt;br /&gt;
** &amp;lt;code&amp;gt;maxUploadIdleTimeout&amp;lt;/code&amp;gt; - Timeout after that idle uploads are deleted.&lt;br /&gt;
** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard folder of the user&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt; – the standard task folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt; – the standard calendar folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt; – the standard contacts folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt; – the private infostore folder (read-only, since v6.20.1)&lt;br /&gt;
*** &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt; – whether EAS folder selection is enabled (read-only)&lt;br /&gt;
** &amp;lt;code&amp;gt;mail/&amp;lt;/code&amp;gt; – settings for the email module (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with.  (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard email folders (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;htmlinline&amp;lt;/code&amp;gt; – activate inlining of HTML attachments. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;colorquote&amp;lt;/code&amp;gt; – color quoted lines. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;harddelete&amp;lt;/code&amp;gt; – delete emails at once. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;inlineforward&amp;lt;/code&amp;gt; – forward messages as inline or attachment. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;notifyonreadack&amp;lt;/code&amp;gt; – notify on read acknowledgement. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;msgpreview&amp;lt;/code&amp;gt; – show a message preview. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;ignorereplytext&amp;lt;/code&amp;gt; (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;nocopytosent&amp;lt;/code&amp;gt; – don't put a copy to the sent folder when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; - Spam Button should be displayed in GUI or not. (deprecated 2008-04-29)&lt;br /&gt;
** &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;autoSearch&amp;lt;/code&amp;gt; - If a search for all users, groups and resources when participant selection dialog is opened. (read-only, added 2008-10-09/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;maximumNumberParticipants&amp;lt;/code&amp;gt; – Defines the maximum number of participants for appointments and tasks. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;showWithoutEmail&amp;lt;/code&amp;gt; - If external participants without email should be shown.&lt;br /&gt;
*** &amp;lt;code&amp;gt;showDialog&amp;lt;/code&amp;gt; – Enables participant selection dialog for appointments and tasks. (read-only, added 2008-04-30/SP4)&lt;br /&gt;
** &amp;lt;code&amp;gt;availableModules&amp;lt;/code&amp;gt; – Contains a JSON array listing all enabled modules for a user. GUI loads Plugins through this list. To get your plugin listed here, create a subtree below &amp;lt;code&amp;gt;modules/&amp;lt;/code&amp;gt; without a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; subelement or with a subelement containing &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; (read-only, added 2008-02-25)&lt;br /&gt;
** &amp;lt;code&amp;gt;minimumSearchCharacters&amp;lt;/code&amp;gt; – Minimum number of characters a search pattern must have to prevent large responses and slow queries. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
** &amp;lt;code&amp;gt;modules&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;portal&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for portal module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;appendmailtext&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allowhtmlimages&amp;lt;/code&amp;gt; – Alters default setting whether external images contained in HTML content are allowed or not (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;colorquoted&amp;lt;/code&amp;gt; – color quoted lines (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectFolder&amp;lt;/code&amp;gt; – contact folder id to save mail addresses from sent mails (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectEnabled&amp;lt;/code&amp;gt; – switch contact collection on/off (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailAccess&amp;lt;/code&amp;gt; – enables/disables contact collection for incoming mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailTransport&amp;lt;/code&amp;gt; – enables/disables contact collection for outgoing mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;deletemail&amp;lt;/code&amp;gt; – delete emails or move to trash (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
***** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;forwardmessage&amp;lt;/code&amp;gt; – forward messages as inline or attachment (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for mail module&lt;br /&gt;
**** &amp;lt;code&amp;gt;inlineattachments&amp;lt;/code&amp;gt; – activate inlining of HTML attachments (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;linewrap&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – if mail module is enabled or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;phishingheaders&amp;lt;/code&amp;gt; – header(s) identifying phishing headers (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;replyallcc&amp;lt;/code&amp;gt; – put all recipients on reply all into CC (added 2008-12-16/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; – Spam Button should be displayed in GUI or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails (added 2008-02-25)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_conflict&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_teamview&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the calendar module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted appointments (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPrivate&amp;lt;/code&amp;gt; Default status for new appointments in private folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPublic&amp;lt;/code&amp;gt; Default status for new appointments in public folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the contacts module&lt;br /&gt;
**** &amp;lt;code&amp;gt;mailAddressAutoSearch&amp;lt;/code&amp;gt; – Define if a search is triggered when the recipient selection dialog is opened or the folder is changed. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; True if the contact module is enabled for the current user, false otherwise.&lt;br /&gt;
**** &amp;lt;code&amp;gt;singleFolderSearch&amp;lt;/code&amp;gt; – True if the current user is allowed to search for contacts only in a single folder. False if contact searches across all folders are allowed. (read-only, added 2009-02-04/SP5 U1)&lt;br /&gt;
**** &amp;lt;code&amp;gt;characterSearch&amp;lt;/code&amp;gt; – True if the side bar for searching for contacts by a start letter should be displayed. False if the side bar should be hidden. (read-only, added 2009-05-29/6.10)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allFoldersForAutoComplete&amp;lt;/code&amp;gt; – true if an auto complete search may omit the folder identifier array and search for contacts in all readable folders. This is configured through the contact.properties configuration file. (read-only, added 2010-07-22/v6.18.0)&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the tasks module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;delegate_tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted tasks (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined tasks created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined taks that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the infostore module&lt;br /&gt;
**** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – the standard infostore folders (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the default infostore trash folder (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;pictures&amp;lt;/code&amp;gt; – identifier of the default infostore pictures folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;documents&amp;lt;/code&amp;gt; – identifier of the default infostore documents folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;music&amp;lt;/code&amp;gt; – identifier of the default infostore music folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;videos&amp;lt;/code&amp;gt; – identifier of the default infostore videos folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;templates&amp;lt;/code&amp;gt; – identifier of the default infostore templates folder (read-only, since 7.8.0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;interfaces&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;ical&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;syncml&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; UI settings for the folder tree&lt;br /&gt;
**** &amp;lt;code&amp;gt;public_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – Selected folder tree, the user wants to use. Currents trees are 0 for the known OX folder tree and 1 for the new virtual folder tree. (added 2010-04-09/6.18)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.extras&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Extras link in the configuration (read only, added 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to change the Password within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.personaldata&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to edit personal contact information within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.group&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit groups and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.resource&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit resources and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.publish&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to publish items. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to subscribe sources. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;olox20&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Tells the UI if the user is allowed to use the OXtender for Microsoft Outlook 2. (read only, added 2011-03-15/6.20)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is set to false to prevent the UI from trying to load a plugin. (read only, added 2011-03-15/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
****&amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is true if the OXUpdater package is installed and started. (read only, added 2011-06-01/6.20)&lt;br /&gt;
****&amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Is true if the user is allowed to download the OXUpdater. Otherwise it's false. (read only, added 2011-06-01/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;showStrength&amp;lt;/code&amp;gt; – Show a widget, which displays the current passwort Strength while entering. (default: false)&lt;br /&gt;
**** &amp;lt;code&amp;gt;minLength&amp;lt;/code&amp;gt; – The minimum length of an entered password. (default: 4)&lt;br /&gt;
**** &amp;lt;code&amp;gt;maxLength&amp;lt;/code&amp;gt; – The maximum length of an entered password. 0 for unlimited. (default: 0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;regexp&amp;lt;/code&amp;gt; – Defines the class of allowed special characters as Regular Expression. (default: [^a-z0-9])&lt;br /&gt;
**** &amp;lt;code&amp;gt;special&amp;lt;/code&amp;gt; – Shows an example of allowed special characters to the user. Should be a subset of &amp;quot;regexp&amp;quot; in a human readable format. (default: $, _, or %) &lt;br /&gt;
&lt;br /&gt;
=== Get configuration data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
=== Set configuration data ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The new value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config?action=get_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1234&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
Note: Only allowed for context administrator!&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config?action=set_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to set.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the value to set; e.g&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;value&amp;quot;:&amp;quot;test1237&amp;quot;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its new value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1237&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;folders&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The folders module is used to access the OX folder structure.&lt;br /&gt;
&lt;br /&gt;
=== Special System Folders ===&lt;br /&gt;
&lt;br /&gt;
Folders with some kind of special.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! ID !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 6 || contacts || System Users&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get root folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=root&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response: An array with data for all folders at the root level of the folder structure. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common folder data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 6 || last_modified_utc || Timestamp || Timestamp of the last modification. Note that the type is Timestamp, not Time. See [[#Date and time]] for details. (added 2008-10-17, with SP5, temporary workaround)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed folder data&lt;br /&gt;
! ID  !! Name            !! Type             !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || title           || String           || Name of this folder.&lt;br /&gt;
|-&lt;br /&gt;
| 301 || module          || String           || Name of the module which implements this folder; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot;, or &amp;quot;mail&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 302 || type            || Number           || Type of folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || private&lt;br /&gt;
|-&lt;br /&gt;
| 2 || public&lt;br /&gt;
|-&lt;br /&gt;
| 3 || shared&lt;br /&gt;
|-&lt;br /&gt;
| 5 || system folder&lt;br /&gt;
|-&lt;br /&gt;
| 7 || This type is no more in use (legacy type). Will be removed with a future update!&lt;br /&gt;
|-&lt;br /&gt;
| 16 || trash&lt;br /&gt;
|-&lt;br /&gt;
| 20 || pictures&lt;br /&gt;
|-&lt;br /&gt;
| 21 || documents&lt;br /&gt;
|-&lt;br /&gt;
| 22 || music&lt;br /&gt;
|-&lt;br /&gt;
| 23 || videos&lt;br /&gt;
|-&lt;br /&gt;
| 24 || templates&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 304 || subfolders      || Boolean          || true if this folder has subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || own_rights      || Number or String || Permissions which apply to the current user, as described either in [[#PermissionFlags | Permission flags]] or in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| 306 || permissions     || Array            || Each element is an object described in [[#PermissionObject | Permission object]].&lt;br /&gt;
|-&lt;br /&gt;
| 307 || summary         || String           || Information about contained objects.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || standard_folder || Boolean          || Indicates whether or not folder is marked as a default folder (only OX folder)&lt;br /&gt;
|-&lt;br /&gt;
| 309 || total           || Number           || The number of objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 310 || new             || Number           || The number of new objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 311 || unread          || Number           || The number of unread objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 312 || deleted         || Number           || The number of deleted objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 313 || capabilities || Number || Bit mask containing information about mailing system capabilites, as described in [[#Capabilities | capabilities]].&lt;br /&gt;
|-&lt;br /&gt;
| 314 || subscribed || Boolean || Indicates whether this folder should appear in folder tree or not. '''Note:''' Standard folders cannot be unsubscribed.&lt;br /&gt;
|-&lt;br /&gt;
| 315 || subscr_subflds || Boolean || Indicates whether subfolders should appear in folder tree or not.&lt;br /&gt;
|-&lt;br /&gt;
| 316 || standard_folder_type || Number || Indicates the default folder type. Zero for non-default folder. See [[#DefaultTypes | Standard folder types]]&lt;br /&gt;
|-&lt;br /&gt;
| 317 || supported_capabilities || Array || Each element is a String identifying a supported folder capability as described in [[#SupportedCapabilities | supported capabilities]]. Only applicable for non-mail folders. Read Only, Since 7.4.0.&lt;br /&gt;
|-&lt;br /&gt;
| 318 || account_id || String || Will be &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; if the folder does not belong to any account&lt;br /&gt;
(i.e. if its module doesn't support multiple accounts), is a virtual folder or an account-agnostic system folder. Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 3010 || com.openexchange.publish.publicationFlag || Boolean || Indicates whether this folder is published. Read Only, provided by the com.openexchange.publish plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3020 || com.openexchange.subscribe.subscriptionFlag || Boolean || Indicates whether this folder has subscriptions storing their content in this folder. Read Only, provided by the com.openexchange.subscribe plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3030 || com.openexchange.folderstorage.displayName || String || Provides the display of the folder's owner. Read Only, Since 6.20.&lt;br /&gt;
|-&lt;br /&gt;
| 3060 || com.openexchange.share.extendedPermissions || Array || Each element is an object described in [[#ExtendedPermissionObject | Extended permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  0-6 || Folder permissions:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || See the folder.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Create objects in the folder. '''Note''': '''Does not apply to folders of module ''system'''''.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || Create subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Create subfolders&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&amp;lt;br&amp;gt;'''NOTE''': ''Create objects in the folder'' is not covered by ''Create subfolders'' if folder's module is ''system''.&lt;br /&gt;
|-&lt;br /&gt;
|  7-13 || Read permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Read only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Read all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Read all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 14-20 || Write permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Modify only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Modify all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Modify all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 21-27 || Delete permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Delete only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Delete all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Delete all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 28    || Admin flag:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Every operation modifying the folder in some way requires this permission. This are e.g. changing the folder name, modifying the permissions, deleting or moving the folder.&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || For non-mail folders, a number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| rights || String  || For mail folders, the rights string as defined in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capabilities&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Mailing system supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Mailing system supports ordering mails by their thread reference.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Mailing system supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Mailing system supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Mailing system supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note''': Capabilities describe the entire mailing system (mail account), not the specific folder in which they are transmitted. E.g. bit 4 of the capabilities on the user's inbox describes whether subscriptions are supported by the default account, even though the inbox itself cannot be unsubscribed because it's a standard folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DefaultTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Standard Folder Types&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || No default folder.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Task.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Calendar.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Contact.&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Inbox.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Infostore.&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Drafts.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Sent.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Spam.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Trash.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SupportedCapabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Supported Capabilities&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| permissions || Folder storage supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| publication || Folder storage supports folder publication.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Folder storage supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| sort || Folder storage supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| subscription || Folder storage supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get subfolders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;errorOnDuplicateName&amp;lt;/code&amp;gt; – An optional flag to enable or disable (default) check for duplicate folder names within returned folder response (since v6.20.1). If a duplicate folder name is detected, an appropriate error is returned as [[#ResponseBody | response]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders, which have the folder with the requested object ID as parent. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get path ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of a folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all parent nodes until root folder. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for new, modified and deleted folders. New and modified folders are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted folders (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a folder ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested folder. The fields of the object are listed in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id is not present. Since OX access controls are folder-based, the folder object also defines the permissions for the objects it contains. The permissions for a given user or group are defined by the object described in [[#PermissionObject | Permission object]]. The format of the actual permissions depends on the type of the folder. The permissions of mail folders are transmitted as a rights string as defined in section 3 of RFC 2086. Permissions of all other folders are transmitted as a single nonnegative integer number. The permissions for any given action on the folder or on contained objects is defined by a group of bits in the binary representation of this number. Each group of bits is interpreted as a separate number. Zero always means &amp;quot;no permissions&amp;quot;. Any other values add new permissions and always include the permissions of all lower values. The individual values are described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
&lt;br /&gt;
=== Update a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated folder. If the folder was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;cascadePermissions&amp;lt;/code&amp;gt; – (Optional. Defaults to false) Flag to cascade permissions to all sub-folders. The user must have administrative permissions to all sub-folders subject to change. If one permission change fails, the entire operation fails. (Since 7.8.0)&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. Only modified fields are present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder_id&amp;lt;/code&amp;gt; – The parent folder of the newly created folder&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id should not be present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provided that permission is granted to create a folder, its module is bound to the limitation, that the new folder's module must be equal to parent folder's module except that:&lt;br /&gt;
* Parent folder is one of the system folders &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt;. Below these folders task, calendar, and contact modules are permitted.&lt;br /&gt;
* Parent folder's module is one of task, calendar, or contact. Below this kind of folders task, calendar, and contact modules are permitted.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created folder.&lt;br /&gt;
&lt;br /&gt;
=== Delete folders ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The optional timestamp of the last update of the deleted folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered. &lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the folders are deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the folders are not yet located below the trash folder, they are moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of the folders that shall be deleted.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of folders that were '''NOT''' deleted. There may be a lot of different causes for a not deleted folder: A folder has been modified in the mean  time, the user does not have the permission to delete it or those permissions have just been removed, the folder does not exist, etc.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content  ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=clear&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
=== Get all visible folder of a certain module  (since v6.18.2)  ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=allVisible&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;)&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; –  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object containing three fields: &amp;quot;private&amp;quot;, &amp;quot;public, and &amp;quot;shared&amp;quot;. Each field is a JSON array with data for all folders. Each folder is itself described by an array.&lt;br /&gt;
&lt;br /&gt;
=== Get shared folders (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. \&amp;quot;tasks\&amp;quot;, \&amp;quot;calendar\&amp;quot;, \&amp;quot;contacts\&amp;quot;, \&amp;quot;infostore\&amp;quot;). Note: this action is not implemented for module &amp;quot;mail&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders that are considered as shared by the user. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared folder (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared folder to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;tasks&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The tasks module is used to access task information.&lt;br /&gt;
&lt;br /&gt;
=== Get all tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskAndAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task and appointment data&lt;br /&gt;
! ID  !! Name                     !! Type         !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 200 || title                    || String       || Short description.&lt;br /&gt;
|-&lt;br /&gt;
| 201 || start_date               || Date or Time || Inclusive start of the event as Date for tasks and whole day appointments and Time for normal appointments. For sequencies, this date must be part of the sequence, i. e. sequencies always start at this date. (deprecated for tasks since v7.6.1, replaced by start_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 202 || end_date                 || Date or Time || Exclusive end of the event as Date for tasks and whole day appointments and as Time for normal appointments.  (deprecated for tasks since v7.6.1, replaced by end_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 203 || note                     || String       || Long description.&lt;br /&gt;
|-&lt;br /&gt;
| 204 || alarm                    || Number or Time || Specifies when to notify the participants as the number of minutes before the start of the appointment (-1 for &amp;quot;no alarm&amp;quot;). For tasks, the Time value specifies the absolute time when the user should be notified.&lt;br /&gt;
|-&lt;br /&gt;
| 209 || recurrence_type          || Number       || Specifies the type of the recurrence for a task sequence:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none (single event)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || daily&lt;br /&gt;
|-&lt;br /&gt;
| 2 || weekly&lt;br /&gt;
|-&lt;br /&gt;
| 3 || monthly&lt;br /&gt;
|-&lt;br /&gt;
| 4 || yearly&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 212 || days                     || Number       || Specifies which days of the week are part of a sequence. The value is a bitfield with bit 0 indicating sunday, bit 1 indicating monday and so on. May be present if recurrence_type &amp;gt; 1. If allowed but not present, the value defaults to 127 (all 7 days).&lt;br /&gt;
|-&lt;br /&gt;
| 213 || day_in_month             || Number       || Specifies which day of a month is part of the sequence. Counting starts with 1. If the field &amp;quot;days&amp;quot; is also present, only days selected by that field are counted. If the number is bigger than the number of available days, the last available day is selected. Present if and only if recurrence_type &amp;gt; 2.&lt;br /&gt;
|-&lt;br /&gt;
| 214 || month                    || Number       || Month of the year in yearly sequencies. 0 represents January, 1 represents February and so on. Present if and only if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 215 || interval                 || Number       || Specifies an integer multiplier to the interval specified by recurrence_type. Present if and only if recurrence_type &amp;gt; 0. Must be 1 if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 216 || until                    || Date         || Inclusive end date of a sequence. May be present only if recurrence_type &amp;gt; 0. The sequence has no end date if recurrence_type &amp;gt; 0 and this field is not present. Note: since this is a Date, the entire day after the midnight specified by the value is included.&lt;br /&gt;
|-&lt;br /&gt;
| 217 || notification             || Boolean      || If true, all participants are notified of any changes to this object. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client.&lt;br /&gt;
|-&lt;br /&gt;
| 220 || participants             || Array        || Each element identifies a participant, user, group or booked resource as described in [[#Participant | participant table]].&lt;br /&gt;
|-&lt;br /&gt;
| 221 || users                    || Array        || Each element represents a participant as described in [[#UserParticipantObject | User participant object]]. User groups are resolved and are represented by their members. Any user can occur only once.&lt;br /&gt;
|-&lt;br /&gt;
| 222 || occurrences || Number || Specifies how often a recurrence should appear. May be present only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 223 || uid || String || Can only be written when the object is created. Internal and external globally unique identifier of the appointment or task. Is used to recognize appointments within iCal files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 224 || organizer || String || Contains the email address of the appointment organizer which is not necessarily an internal user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 225 || sequence || Number || iCal sequence number. Not implemented for tasks. Must be incremented on update. Will be incremented by the server, if not set.&lt;br /&gt;
|-&lt;br /&gt;
| 226 || confirmations || Array || Each element represents a confirming participant as described in [[#ConfirmingParticipant | confirming participant]]. This can be internal and external user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 227 || organizerId || Number || Contains the userIId of the appointment organizer if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 228 || principal || String || Contains the email address of the appointment principal which is not necessarily an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 229 || principalId || Number || Contains the userIId of the appointment principal if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 401 || full_time   || Boolean || True if the event is a whole day appointment or task, false otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Participant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant identifier&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || User ID&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 2 || user group&lt;br /&gt;
|-&lt;br /&gt;
| 3 || resource&lt;br /&gt;
|-&lt;br /&gt;
| 4 || resource group&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || mail address of an external participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UserParticipantObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | User participant object&lt;br /&gt;
! Name           !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id             || Number || User ID. Confirming for other users only works for appointments and not for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| display_name   || String || Displayable name of the participant.&lt;br /&gt;
|-&lt;br /&gt;
| confirmation   || Number ||&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| confirmmessage || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConfirmingParticipant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Confirming participant&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || email address of external participant&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || display name of external participant&lt;br /&gt;
|-&lt;br /&gt;
| status || Number ||&lt;br /&gt;
{|&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| message || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task data&lt;br /&gt;
! ID  !! Name              !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || status            || Number || Status of the task:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || not started&lt;br /&gt;
|-&lt;br /&gt;
| 2 || in progress&lt;br /&gt;
|-&lt;br /&gt;
| 3 || done&lt;br /&gt;
|-&lt;br /&gt;
| 4 || waiting&lt;br /&gt;
|-&lt;br /&gt;
| 5 || deferred&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 301 || percent_completed || Number || How much of the task is completed. An integer number between 0 and 100.&lt;br /&gt;
|-&lt;br /&gt;
| 302 || actual_costs|| Number || A monetary attribute to store actual costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 303 || actual_duration&lt;br /&gt;
|-&lt;br /&gt;
| 304 || after_complete || Date || Deprecated. Only present in AJAX interface. Value will not be stored on OX server.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || billing_information&lt;br /&gt;
|-&lt;br /&gt;
| 307 || target_costs|| Number || A monetary attribute to store target costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || target_duration&lt;br /&gt;
|-&lt;br /&gt;
| 309 || priority || Number || 1 = LOW, 2 = MEDIUM, 3 = HIGH&lt;br /&gt;
|-&lt;br /&gt;
| 312 || currency&lt;br /&gt;
|-&lt;br /&gt;
| 313 || trip_meter&lt;br /&gt;
|-&lt;br /&gt;
| 314 || companies&lt;br /&gt;
|-&lt;br /&gt;
| 315 || date_completed&lt;br /&gt;
|-&lt;br /&gt;
| 316 || start_time               || Date or Time || Inclusive start as Date for whole day tasks and Time for normal tasks. &lt;br /&gt;
|-&lt;br /&gt;
| 317 || end_time                 || Date or Time || Exclusive end as Date for whole day tasks and as Time for normal tasks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested tasks.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; – Which kinds of updates should be ignored. Omit this parameter or set it to &amp;quot;deleted&amp;quot; to not have deleted tasks identifier in the response. Set this parameter to &amp;quot;false&amp;quot; and the response contains deleted tasks identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted tasks. New and modified tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted tasks would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a task ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the task's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested task. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder Identifier through that the task is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated task.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated task. If the task was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
=== Create a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created task.&lt;br /&gt;
&lt;br /&gt;
=== Delete task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An object in the field “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete tasks (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Confirm task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the to confirm task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through that the task is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirm task.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot; and &amp;quot;confirmmessage&amp;quot; as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Search for tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified , then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object with attributes described in [[#SearchTasks | Search tasks]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchTasks&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search tasks&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find tasks. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || (optional) Defines the folder to search for tasks in. If this is omitted in all task folders will be searched.&lt;br /&gt;
|-&lt;br /&gt;
| start || Date or Time || (optional) Inclusive start date for a time range the tasks should end in. If start is omitted end is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| end || Date or Time || (optional) Exclusive end date for a time range the tasks should end in. If this parameter is omitted the time range has an open end.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with matching tasks. Tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;contacts&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The contacts module is used to access contact information.&lt;br /&gt;
&lt;br /&gt;
=== Get all contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried (optional from 6.22.2 on: If not set, the contents of all visible folders are used instead).&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedContactData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed contact data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 223 ||  || uid         || String || Can only be written when the object is created. Internal and external globally unique identifier of the contact. Is used to recognize contacts within vCard files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 500 || Display name                || display_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 501 || Given name                  || first_name           || String || First name.&lt;br /&gt;
|-&lt;br /&gt;
| 502 || Sur name                    || last_name            || String || Last name.&lt;br /&gt;
|-&lt;br /&gt;
| 503 || Middle name                 || second_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 504 || Suffix                      || suffix               || String&lt;br /&gt;
|-&lt;br /&gt;
| 505 || Title                       || title                || String&lt;br /&gt;
|-&lt;br /&gt;
| 506 || Street home                 || street_home          || String&lt;br /&gt;
|-&lt;br /&gt;
| 507 || Postal code home            || postal_code_home || String&lt;br /&gt;
|-&lt;br /&gt;
| 508 || City home                   || city_home            || String&lt;br /&gt;
|-&lt;br /&gt;
| 509 || State home                  || state_home           || String&lt;br /&gt;
|-&lt;br /&gt;
| 510 || Country home                || country_home         || String&lt;br /&gt;
|-&lt;br /&gt;
| 511 || Birthday                    || birthday             || Date&lt;br /&gt;
|-&lt;br /&gt;
| 512 || Marital status              || marital_status || String&lt;br /&gt;
|-&lt;br /&gt;
| 513 || Number of children          || number_of_children || String&lt;br /&gt;
|-&lt;br /&gt;
| 514 || Profession                  || profession           || String&lt;br /&gt;
|-&lt;br /&gt;
| 515 || Nickname                    || nickname             || String&lt;br /&gt;
|-&lt;br /&gt;
| 516 || Spouse name                 || spouse_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 517 || Anniversary                 || anniversary          || Date&lt;br /&gt;
|-&lt;br /&gt;
| 518 || Note                        || note                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 519 || Department                  || department           || String&lt;br /&gt;
|-&lt;br /&gt;
| 520 || Position                    || position             || String&lt;br /&gt;
|-&lt;br /&gt;
| 521 || Employee type               || employee_type  || String&lt;br /&gt;
|-&lt;br /&gt;
| 522 || Room number                 || room_number || String&lt;br /&gt;
|-&lt;br /&gt;
| 523 || Street business             || street_business      || String&lt;br /&gt;
|-&lt;br /&gt;
| 524 || Internal user id            || user_id || Number&lt;br /&gt;
|-&lt;br /&gt;
| 525 || Postal code business        || postal_code_business || String&lt;br /&gt;
|-&lt;br /&gt;
| 526 || City business               || city_business        || String&lt;br /&gt;
|-&lt;br /&gt;
| 527 || State business              || state_business       || String&lt;br /&gt;
|-&lt;br /&gt;
| 528 || Country business            || country_business     || String&lt;br /&gt;
|-&lt;br /&gt;
| 529 || Number of employee          || number_of_employees || String&lt;br /&gt;
|-&lt;br /&gt;
| 530 || Sales volume                || sales_volume || String&lt;br /&gt;
|-&lt;br /&gt;
| 531 || Tax id                      || tax_id               || String&lt;br /&gt;
|-&lt;br /&gt;
| 532 || Commercial register         || commercial_register  || String&lt;br /&gt;
|-&lt;br /&gt;
| 533 || Branches                    || branches             || String&lt;br /&gt;
|-&lt;br /&gt;
| 534 || Business category           || business_category    || String&lt;br /&gt;
|-&lt;br /&gt;
| 535 || Info                        || info                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 536 || Manager's name              || manager_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 537 || Assistant's name            || assistant_name       || String&lt;br /&gt;
|-&lt;br /&gt;
| 538 || Street other                || street_other         || String&lt;br /&gt;
|-&lt;br /&gt;
| 539 || City other                  || city_other           || String&lt;br /&gt;
|-&lt;br /&gt;
| 540 || Postal code other           || postal_code_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 541 || Country other               || country_other        || String&lt;br /&gt;
|-&lt;br /&gt;
| 542 || Telephone business 1        || telephone_business1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 543 || Telephone business 2        || telephone_business2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 544 || FAX business                || fax_business         || String&lt;br /&gt;
|-&lt;br /&gt;
| 545 || Telephone callback          || telephone_callback   || String&lt;br /&gt;
|-&lt;br /&gt;
| 546 || Telephone car               || telephone_car        || String&lt;br /&gt;
|-&lt;br /&gt;
| 547 || Telephone company           || telephone_company    || String&lt;br /&gt;
|-&lt;br /&gt;
| 548 || Telephone home 1            || telephone_home1      || String&lt;br /&gt;
|-&lt;br /&gt;
| 549 || Telephone home 2            || telephone_home2      || String&lt;br /&gt;
|-&lt;br /&gt;
| 550 || FAX home                    || fax_home             || String&lt;br /&gt;
|-&lt;br /&gt;
| 551 || Cellular telephone 1        || cellular_telephone1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 552 || Cellular telephone 2        || cellular_telephone2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 553 || Telephone other             || telephone_other      || String&lt;br /&gt;
|-&lt;br /&gt;
| 554 || FAX other                   || fax_other            || String&lt;br /&gt;
|-&lt;br /&gt;
| 555 || Email 1                     || email1               || String&lt;br /&gt;
|-&lt;br /&gt;
| 556 || Email 2                     || email2               || String&lt;br /&gt;
|-&lt;br /&gt;
| 557 || Email 3                     || email3               || String&lt;br /&gt;
|-&lt;br /&gt;
| 558 || URL                         || url                  || String&lt;br /&gt;
|-&lt;br /&gt;
| 559 || Telephone ISDN              || telephone_isdn       || String&lt;br /&gt;
|-&lt;br /&gt;
| 560 || Telephone pager             || telephone_pager      || String&lt;br /&gt;
|-&lt;br /&gt;
| 561 || Telephone primary           || telephone_primary    || String&lt;br /&gt;
|-&lt;br /&gt;
| 562 || Telephone radio             || telephone_radio      || String&lt;br /&gt;
|-&lt;br /&gt;
| 563 || Telephone telex             || telephone_telex      || String&lt;br /&gt;
|-&lt;br /&gt;
| 564 || Telephone TTY/TDD           || telephone_ttytdd     || String&lt;br /&gt;
|-&lt;br /&gt;
| 565 || Instantmessenger 1          || instant_messenger1   || String&lt;br /&gt;
|-&lt;br /&gt;
| 566 || Instantmessenger 2          || instant_messenger2   || String&lt;br /&gt;
|-&lt;br /&gt;
| 567 || Telephone IP                || telephone_ip         || String&lt;br /&gt;
|-&lt;br /&gt;
| 568 || Telephone assistant         || telephone_assistant  || String&lt;br /&gt;
|-&lt;br /&gt;
| 569 || Company                     || company              || String&lt;br /&gt;
|-&lt;br /&gt;
| 570 ||                             || image1 || String&lt;br /&gt;
|-&lt;br /&gt;
| 571 || Dynamic Field 1             || userfield01 || String&lt;br /&gt;
|-&lt;br /&gt;
| 572 || Dynamic Field 2             || userfield02 || String&lt;br /&gt;
|-&lt;br /&gt;
| 573 || Dynamic Field 3             || userfield03 || String&lt;br /&gt;
|-&lt;br /&gt;
| 574 || Dynamic Field 4             || userfield04 || String&lt;br /&gt;
|-&lt;br /&gt;
| 575 || Dynamic Field 5             || userfield05 || String&lt;br /&gt;
|-&lt;br /&gt;
| 576 || Dynamic Field 6             || userfield06 || String&lt;br /&gt;
|-&lt;br /&gt;
| 577 || Dynamic Field 7             || userfield07 || String&lt;br /&gt;
|-&lt;br /&gt;
| 578 || Dynamic Field 8             || userfield08 || String&lt;br /&gt;
|-&lt;br /&gt;
| 579 || Dynamic Field 9             || userfield09 || String&lt;br /&gt;
|-&lt;br /&gt;
| 580 || Dynamic Field 10            || userfield10 || String&lt;br /&gt;
|-&lt;br /&gt;
| 581 || Dynamic Field 11            || userfield11 || String&lt;br /&gt;
|-&lt;br /&gt;
| 582 || Dynamic Field 12            || userfield12 || String&lt;br /&gt;
|-&lt;br /&gt;
| 583 || Dynamic Field 13            || userfield13 || String&lt;br /&gt;
|-&lt;br /&gt;
| 584 || Dynamic Field 14            || userfield14 || String&lt;br /&gt;
|-&lt;br /&gt;
| 585 || Dynamic Field 15            || userfield15 || String&lt;br /&gt;
|-&lt;br /&gt;
| 586 || Dynamic Field 16            || userfield16 || String&lt;br /&gt;
|-&lt;br /&gt;
| 587 || Dynamic Field 17            || userfield17 || String&lt;br /&gt;
|-&lt;br /&gt;
| 588 || Dynamic Field 18            || userfield18 || String&lt;br /&gt;
|-&lt;br /&gt;
| 589 || Dynamic Field 19            || userfield19 || String&lt;br /&gt;
|-&lt;br /&gt;
| 590 || Dynamic Field 20            || userfield20 || String || Contains a UUID if one was assigned (after 6.18.2)&lt;br /&gt;
|-&lt;br /&gt;
| 592 ||                             || distribution_list    || Array  || If this contact is a distribution list, then this field is an array of objects. Each object describes a member of the list as defined in [[#DistributionListMember | Distribution list member]].&lt;br /&gt;
|-&lt;br /&gt;
| 594 || Number of distributionlists || number_of_distribution_list || Number&lt;br /&gt;
|-&lt;br /&gt;
| 596 ||                             || number_of_images || Number&lt;br /&gt;
|-&lt;br /&gt;
| 597 ||                             || image_last_modified || Timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 598 || State other                 || state_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 599 ||                             || file_as || String&lt;br /&gt;
|-&lt;br /&gt;
| 601 ||                             || image1_content_type || String&lt;br /&gt;
|-&lt;br /&gt;
| 602 ||                             || mark_as_distributionlist || Boolean&lt;br /&gt;
|-&lt;br /&gt;
| 605 || Default address             || default_address || Number&lt;br /&gt;
|-&lt;br /&gt;
| 606 ||                             || image1_url || String&lt;br /&gt;
|-&lt;br /&gt;
| 608 ||                             || useCount || Number || In case of sorting purposes the column 609 is also available, which places global address book contacts at the beginning of the result. If 609 is used, the order direction (ASC, DESC) is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 610 ||                             || yomiFirstName || String || Kana based representation for the First Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 611 ||                             || yomiLastName || String || Kana based representation for the Last Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 612 ||                             || yomiCompany || String || Kana based representation for the Company. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 613 ||                             || addressHome || String || Support for Outlook 'home' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 614 ||                             || addressBusiness || String || Support for Outlook 'business' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 615 ||                             || addressOther || String || Support for Outlook 'other' address field. (since 6.20.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DistributionListMember&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Distribution list member&lt;br /&gt;
! Name       !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id         || String || Object ID of the member's contact if the member is an existing contact.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Parent folder ID of the member's contact if the member is an existing contact (preliminary, from 6.22 on).&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| mail       || String || Email address (mandatory before 6.22, afterwards optional if you are referring to an internal contact)&lt;br /&gt;
|-&lt;br /&gt;
| mail_field || Number || Which email field of an existing contact (if any) is used for the mail field.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || independent contact&lt;br /&gt;
|-&lt;br /&gt;
| 1 || default email field (email1)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || second email field (email2)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || third email field (email3)&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects. Each object contains fields “id” and “folder” of requested contacts.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=listuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with id&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
Available with SP4&lt;br /&gt;
&lt;br /&gt;
=== Get updated contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested contacts.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted contacts. New and modified contacts are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted contacts (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a contact ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the contact's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Get contact by user ID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=getuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – User ID (not Object ID) of the requested user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. &lt;br /&gt;
&lt;br /&gt;
Available with SP4 package.&lt;br /&gt;
&lt;br /&gt;
=== Update a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder identifier through that the contact is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated contact. If the contact was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
To remove some contact image send the image attribute set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To change or add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File_uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Create a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created contact.&lt;br /&gt;
&lt;br /&gt;
To add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Delete contacts (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected contacts with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchContacts | Search contacts]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContacts&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find contacts. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves. Matching is performed against any substring of the field &amp;lt;code&amp;gt;display_name&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search contacts with the given startletter. If this field is present, the pattern is matched against the contact field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Array of Number || If a list of folder identifiers or at least a single folder identifier is given, only in that folders will be searched for contacts. This paramenter is optional but searching in all contact folders that are viewable and where objects can be read in is more expensive on that database than searching in a dedicated number of them. The possibility to provide here an array of folder identifier has been added with 6.10.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchContactsAlternative | Search contacts alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContactsAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches contacts where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches contacts where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches contacts where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| email1 || String || Searches contacts where the email1 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email2 || String || Searches contacts where the email2 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email3 || String || Searches contacts where the email3 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| company || String || Searches contacts where the company match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| categories || String || Searches contacts where the categories match with the given search pattern. &lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, a contact is returned if any specified pattern matches at the start of the corresponding field. Otherwise, a contact is returned if all specified patterns match any substring of the corresponding field.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed as if orSearch were set to true. The actual value of orSearch is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| exactMatch || Boolean || If set to true, contacts are returned where the specified patterns match the corresponding fields exactly. Otherwise, a 'startsWith' or 'substring' comparison is used based on the 'orSearch' parameter. (requires version &amp;gt; 6.22.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by filter (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=advancedSearch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#Module_.22search.22_.28alternative_suggestion.2C_still_preliminary.29 | Search Filter]]&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by anniversary (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose anniversary falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=anniversaries&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their anniversary in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by birthday (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose birthday falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=birthdays&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their birthday in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Auto-complete contacts (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts based on a prefix, usually used to auto-complete e-mail recipients while the user is typing.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; – The query to search for.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; (optional)  – Whether to only include contacts with at least one e-mail address. Defaults to &amp;quot;true&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. Since 7.8.1: If this parameter is missing, response is sorted by a user-specific use count of contacts, ID of contacts' parent folder and display name.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is &lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;calendar&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The calendar module is used to access calendar data.&lt;br /&gt;
&lt;br /&gt;
=== Get all appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) – Object ID of the folder, whose contents are queried. If not specified, defaults to all calendar folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which start on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which end before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Appointment sequencies are broken up into individual appointments and each occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed appointment data&lt;br /&gt;
! ID  !! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 206 || recurrence_id            || Number       || Object ID of the entire appointment sequence. Present on series and change exception appointments. Equals to object identifier on series appointment and is different to object identifier on change exceptions.&lt;br /&gt;
|-&lt;br /&gt;
| 207 || recurrence_position      || Number       || 1-based position of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 208 || recurrence_date_position || Date         || Date of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 210 || change_exceptions                     || Array       || An array of Dates, representing all change exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 211 || delete_exceptions                     || Array       || An array of Dates, representing all delete exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 400 || location    || String  || Location&lt;br /&gt;
|-&lt;br /&gt;
| 402 || shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 408 || timezone    || String  || Timezone&lt;br /&gt;
|-&lt;br /&gt;
| 410 || recurrence_start    || Date  || Start of a sequence without time&lt;br /&gt;
|-&lt;br /&gt;
|  || ignore_conflicts || Boolean  || Ignore soft conflicts for the new or modified appointment. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get appointment information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=has&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response is an array of booleans. Array length is the number of days. Each entry in the array corresponds with one day in the range that was queried, explaining whether there is an appointment on this day or not.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with full object IDs (folder, id and optionally either recurrence_position or recurrence_date_position) of requested appointments.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an appointment&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| pos  || Number || Value of the field recurrence_position, if present in the appointment.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get updated appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried. That parameter may be absent in case &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is set to &amp;quot;deleted&amp;quot;, which means all accessible calendar folders are considered. If  &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is not set to &amp;quot;deleted&amp;quot;, that parameter is mandatory.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested appointments.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted appointments. New and modified appointments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted appointments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by objects described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]] instead of arrays. Appointment sequencies are broken up into individual appointments and each modified occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
=== Get an appointment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_position&amp;lt;/code&amp;gt; (optional) – Recurrence Position requested appointment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested appointment. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the appointment's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated appointment. If the appointment was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field recurrence_id is always present if it is present in the original appointment. The field recurrence_position is present if it is present in the original appointment and only this single appointment should be modified. The field id is not present because it is already included as a parameter. Other fields are present only if modified.&lt;br /&gt;
&lt;br /&gt;
=== Create an appointment ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: If the appointment was created successfully, an object with the attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created appointment. If the appointment could not be created due to conflicts, the response body is an object with the field &amp;lt;code&amp;gt;conflicts&amp;lt;/code&amp;gt;, which is an array of appointment objects which caused the conflict. Each appointment object which represents a resource conflict contains an additional field &amp;lt;code&amp;gt;hard_conflict&amp;lt;/code&amp;gt; with the Boolean value true. If the user does not have read access to a conflicting appointment, only the fields &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;end_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shown_as&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; are present and the field &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; contains only the participants which caused the conflict.&lt;br /&gt;
&lt;br /&gt;
=== Delete an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: The appointment object to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Delete appointments (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of appointment objects to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Confirm appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the appointment to confirm.&lt;br /&gt;
* &amp;lt;code&amp;gt;occurrence&amp;lt;/code&amp;gt; – The numeric identifier of the occurrence to which the confirmation applies (in case &amp;quot;id&amp;quot; denotes a series appointment). Available with v7.6.0&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through which the appointment is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirmed appointment.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot;, &amp;quot;confirmmessage&amp;quot; and &amp;quot;id&amp;quot; (optional) as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Free &amp;amp; Busy ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - Internal user id. Must be obtained from the contact module.&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; - Constant for user or resource (1 for users, 3 for resources)&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which lie between start and end as described.&amp;lt;br&amp;gt;&lt;br /&gt;
This objects consist of:&lt;br /&gt;
{| id=&amp;quot;FreeAndBusyAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| start_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|- &lt;br /&gt;
| end_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Folder ID. Only set, if the user has the right to see the object. (added 2009-08-18/6.12) &lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean || True if the appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Search appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchAppointments&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search appointments&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find appointments. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search appointments with the given starting letter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get new appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=newappointments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; – limits the number of returned object to the given value.&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Resolve UID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=resolveuid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The UID to be resolved.&lt;br /&gt;
&lt;br /&gt;
Response: An object object with the field &amp;quot;id&amp;quot; containing the ox-object id, if existing, an error message otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Get all Change Exceptions (Since v7.2.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=getChangeExceptions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object id of the appointment series.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointments. &lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The mail module is used to access mail data.&lt;br /&gt;
&lt;br /&gt;
When mails are stored on an IMAP server, some functionality is not available due to restrictions of the IMAP protocol. Such functionality is marked with &amp;quot;not IMAP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get mail count ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=count&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder whose mail count is queried&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An integer value representing folder's mail count&lt;br /&gt;
&lt;br /&gt;
=== Get all mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedMailData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed mail data&lt;br /&gt;
! ID  !! Name                 !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 102 || color_label || Number || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive).&lt;br /&gt;
|-&lt;br /&gt;
| 600 || id                   || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 601 || folder_id            || String  || Object ID of the parent folder&lt;br /&gt;
|-&lt;br /&gt;
| 602 || attachment           || Boolean || Specifies whether this mail has attachments.&lt;br /&gt;
|-&lt;br /&gt;
| 603 || from                 || Array   || Each element is a two-element array specifying one sender. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values.&lt;br /&gt;
|-&lt;br /&gt;
| 604 || to                   || Array   || Each element is a two-element array (see the from field) specifying one receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 605 || cc                   || Array   || Each element is a two-element array (see the from field) specifying one carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 606 || bcc                  || Array   || Each element is a two-element array (see the from field) specifying one blind carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 607 || subject              || String  || Subject line.&lt;br /&gt;
|-&lt;br /&gt;
| 608 || size                 || Number  || Size of the mail in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 609 || sent_date            || Time    || Date and time as specified in the mail by the sending client.&lt;br /&gt;
|-&lt;br /&gt;
| 610 || received_date        || Time    || Date and time as measured by the receiving server.&lt;br /&gt;
|-&lt;br /&gt;
| 611 || flags                || Number  || Various system flags. A sum of zero or more of following values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || answered&lt;br /&gt;
|-&lt;br /&gt;
| 2  || deleted&lt;br /&gt;
|-&lt;br /&gt;
| 4  || draft&lt;br /&gt;
|-&lt;br /&gt;
| 8  || flagged&lt;br /&gt;
|-&lt;br /&gt;
| 16 || recent&lt;br /&gt;
|-&lt;br /&gt;
| 32 || seen&lt;br /&gt;
|-&lt;br /&gt;
| 64 || user&lt;br /&gt;
|-&lt;br /&gt;
| 128 || spam&lt;br /&gt;
|-&lt;br /&gt;
| 256 || forwarded&lt;br /&gt;
|}&lt;br /&gt;
See javax.mail.Flags.Flag for details.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || level                || Number  || Zero-based nesting level in a thread.&lt;br /&gt;
|-&lt;br /&gt;
| 613 || disp_notification_to || String  || Content of message's header “Disposition-Notification-To”&lt;br /&gt;
|-&lt;br /&gt;
| 614 || priority             || Number  || Value of message's “X-Priority” header:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0   || No priority&lt;br /&gt;
|-&lt;br /&gt;
| 5   || Very Low&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Low&lt;br /&gt;
|-&lt;br /&gt;
| 3   || Normal&lt;br /&gt;
|-&lt;br /&gt;
| 2   || High&lt;br /&gt;
|-&lt;br /&gt;
| 1   || Very High&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 615  || msg_ref                 || String  || Message reference on reply/forward.&lt;br /&gt;
|-&lt;br /&gt;
| 651  || flag_seen                 || String  || Special field to sort mails by seen status&lt;br /&gt;
|-&lt;br /&gt;
| 652  || account_name                 || String  || Message's account name.&lt;br /&gt;
|-&lt;br /&gt;
| 653  || account_id                 || int  || Message's account identifier. Since v6.20.2&lt;br /&gt;
|-&lt;br /&gt;
|     || user                 || Array  || An array with user-defined flags as strings.&lt;br /&gt;
|-&lt;br /&gt;
|     || headers                 || Object  || An object with a field for every non-standard header. The header name is the field name. The header value is the value of the field as string.&lt;br /&gt;
|-&lt;br /&gt;
|     || attachments          || Array   || Each element is an attachment as described in [[#Attachment | Attachment]]. The first element is the mail text. If the mail has multiple representations (multipart-alternative), then the alternatives are placed after the mail text and have the field disp set to alternative.&lt;br /&gt;
|-&lt;br /&gt;
|     || nested_msgs          || Array   || Each element is a mail object as described in this table, except for fields id, folder_id and attachment.&lt;br /&gt;
|-&lt;br /&gt;
|     || truncated          || boolean   || true/false if the mail content was trimmed. Since v7.6.1&lt;br /&gt;
|-&lt;br /&gt;
|     || source             || String    || RFC822 source of the mail. Only present for &amp;lt;tt&amp;gt;action=get&amp;amp;attach_src=true&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|     || cid                || String    || The value of the &amp;quot;Content-ID&amp;quot; header, if the header is present.&lt;br /&gt;
|-&lt;br /&gt;
| 654  || original_id                 || String  || The original mail identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|-&lt;br /&gt;
| 655  || original_folder_id                 || String  || The original folder identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Attachment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || String || Object ID (unique only inside the same message)&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || MIME type&lt;br /&gt;
|-&lt;br /&gt;
| content      || String || Content as text. Present only if easily convertible to text.&lt;br /&gt;
|-&lt;br /&gt;
| filename     || String || Displayed filename (mutually exclusive with content).&lt;br /&gt;
|-&lt;br /&gt;
| size         || Number || Size of the attachment in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| disp         || String || Attachment's disposition: null, inline, attachment or alternative.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all mail conversations (since v7.x) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=threadedAll&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;includeSent&amp;lt;/code&amp;gt; - A boolean value to signal that conversations also include messages taken from special &amp;quot;sent&amp;quot; aka &amp;quot;sent items&amp;quot; folder&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON array consisting of JSON objects, each representing a conversation's root message along with its message thread. The root message's JSON object is filled according to specified columns and is enhanced by special &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field representing the full message thread (including the root message itself). The &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field is a JSON array of JSON objects; each representing a message in the conversation sorted by time-line, also filled with specified columns. E.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
   &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
   &amp;quot;unreadCount&amp;quot;:0,&lt;br /&gt;
   &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
   &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
   &amp;quot;thread&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263853&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;26323&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/Sent&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263854&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Search mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON array of JSON objects each containing the search field and its search pattern: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;col&amp;quot;: 612, &amp;quot;pattern&amp;quot;: &amp;quot;Joe&amp;quot;}, {&amp;quot;col&amp;quot;: 614, &amp;quot;pattern&amp;quot;: &amp;quot;Tuesday&amp;quot;}]&amp;lt;/code&amp;gt; Supported values for &amp;lt;code&amp;gt;col&amp;lt;/code&amp;gt; are 603 to 607 (from, to, cc, bcc and subject) and -1 for full text search.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;headers&amp;lt;/code&amp;gt; - (preliminary) A comma-separated list of header names. Each name requests denoted header from each mail&lt;br /&gt;
&lt;br /&gt;
Request body: An array with one object for each requested mail. Each object contains the fields &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter followed by requested headers.&lt;br /&gt;
&lt;br /&gt;
=== Copy mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the copied mail&lt;br /&gt;
&lt;br /&gt;
=== Move mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the moved mail&lt;br /&gt;
&lt;br /&gt;
=== Update mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
'''Note''': If neither parameter &amp;quot;&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&amp;quot; nor parameter &amp;quot;&amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt;&amp;quot; is specified, all folder's messages are updated accordingly. Available with v6.20.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object which carries the new values that ought to be applied to mail as described in [[#UpdateMail | Update mail]] or [[#UpdateMailExtended | Update mail extended]] (available with SP6 v6.10).&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the Object ID of the updated mail and its folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMail&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| color_label || Number || The color number between 0 and 10.&lt;br /&gt;
|-&lt;br /&gt;
| flags || Number || A set of flags to add or remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| value || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to add the flags specified by &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (logical OR), &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to remove them (logical AND with the inverted value).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMailExtended&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail extended (available with SP6 v6.10)&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| set_flags || Number || A set of flags to add. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| clear_flags || Number || A set of flags to remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mark all mails as seen (available with v7.6.0) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=all_seen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: n.a.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Not IMAP: Get updated mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Just an empty JSON array is going to be returned since this action cannot be applied to IMAP.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the mail's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; (optional) – 1 indicates that this request should fill the message compose dialog to edit a message and thus display-specific date is going to be withheld.&lt;br /&gt;
* &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain only the (formatted) message headers as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain the complete message source as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; (optional) – 1 to write the complete message source to output stream. '''NOTE:''' This parameter will only be used if parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; is set to 1.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP4)&lt;br /&gt;
** &amp;quot;raw&amp;quot; returns the content as it is, meaning no preparation are performed and thus no guarantee for safe contents is given (available with SP6 v6.10).&lt;br /&gt;
** &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML.&lt;br /&gt;
** &amp;quot;textNoHtmlAttach&amp;quot; is the same as &amp;quot;text&amp;quot;, but does not deliver the HTML part as attachment in case of multipart/alternative content.&lt;br /&gt;
** &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).&lt;br /&gt;
** &amp;quot;noimg&amp;quot; to allow a possible HTML content being transferred but without original image src attributes which references external images: Can be used to prevent loading external linked images (spam privacy protection).&lt;br /&gt;
** '''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;unseen&amp;lt;/code&amp;gt; (optional) – &amp;quot;1&amp;quot; or &amp;quot;true&amp;quot; to leave an unseen mail as unseen although its content is requested&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
* &amp;lt;code&amp;gt;attach_src&amp;lt;/code&amp;gt; (optional - available since v7.6.1) 1 to let the JSON mail representation being extended by &amp;lt;code&amp;gt;&amp;quot;source&amp;quot;&amp;lt;/code&amp;gt; field containing the mail raw RFC822 source data&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included. '''NOTE:''' Of course response is not a JSON object if either parameter &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; or parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; are set to &amp;quot;1&amp;quot;. Then the response contains plain text. Moreover if optional parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to &amp;quot;1&amp;quot; the complete message source is going to be directly written to output stream to open browser's save dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mails as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_messages&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; –  A comma-separated list of Object IDs of the requested mails&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=attachment&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – ID of the requested attachment '''OR'''&lt;br /&gt;
* &amp;lt;code&amp;gt;cid&amp;lt;/code&amp;gt; – Value of header 'Content-ID' of the requested attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; – 1 overwrites the defined mimetype for this attachment to force the download dialog, otherwise 0.&lt;br /&gt;
* &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt; (optional) – 1 to apply HTML white-list filter rules if and only if requested attachment is of MIME type &amp;lt;code&amp;gt;text/htm*&amp;lt;/code&amp;gt; '''AND''' parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to 0.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this attachment, except the parameter save is set to 1.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mail attachments as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachments.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – A comma-separated list of IDs of the requested attachments&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Send a mail ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;lineWrapAfter&amp;lt;/code&amp;gt; – An integer value specifying the line-wrap setting (only effective for plain-text content); if absent the setting is taken from user's mail settings. Available with v7.8.1.&lt;br /&gt;
&lt;br /&gt;
Request Body: This method uses the encoding multipart/form-data or multipart/mixed.&lt;br /&gt;
* The form filed &amp;lt;code&amp;gt;json_0&amp;lt;/code&amp;gt; contains the rudimentary mail as JSON object as described in [[#DetailedMailData | Detailed mail data]] with just its message body (as html content) defined in nested JSON array &amp;quot;attachments&amp;quot; and its header data (from, to, subject, etc.). The field &amp;quot;content_type&amp;quot; defines whether the mail ought to be sent as plain text (&amp;quot;text/plain&amp;quot;), as html (&amp;quot;text/html&amp;quot;) or  as multipart/alternative (&amp;quot;ALTERNATIVE&amp;quot;). Sending a mail requires some special fields inside JSON mail object. The field &amp;quot;infostore_ids&amp;quot; defines a JSON array of infostore document ID(s) that ought to be appended to this mail as attachments. The field &amp;quot;msgref&amp;quot; indicates the ID of the referenced original mail. Moreover the field &amp;quot;sendtype&amp;quot; indicates the type of the message:&lt;br /&gt;
** 0 - A normal new mail (optional)&lt;br /&gt;
** 1 - A reply mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 2 - A forward mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 3 - A draft edit operation. The field &amp;quot;msgref&amp;quot; must be present in order to delete previous draft message since e.g. IMAP does not support changing/replacing a message but requires a delete-and-insert sequence&lt;br /&gt;
** 4 - Transport of a draft mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 6 - This type signals that user intends to send out a saved draft message and expects the draft message (referenced by &amp;quot;msgref&amp;quot; field) being deleted after successful transport&lt;br /&gt;
Example of a normal new mail which appends user's VCard and requests a read receipt from receiver:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Content-Disposition: form-data; name=&amp;quot;json_0&amp;quot;....{&amp;quot;from&amp;quot;:&amp;quot;\u0022Muster, Karl\u0022 &amp;lt;karl.muster@somewhere.com&amp;gt;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;someone@somewhere.com&amp;quot;,&amp;quot;cc&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bcc&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;subject&amp;quot;:&amp;quot;Mail Subject&amp;quot;,&amp;quot;priority&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;disp_notification_to&amp;quot;:true,&amp;quot;vcard&amp;quot;:1,&lt;br /&gt;
&amp;quot;attachments&amp;quot;:[{&amp;quot;content_type&amp;quot;:&amp;quot;ALTERNATIVE&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;Simple Mail Text!&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;\u000a\u000a&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* The request accepts file fields in upload form that denote referenced files that are going to be appended as attachments&lt;br /&gt;
* For &amp;quot;text/plain&amp;quot; mail bodies, the JSON boolean field &amp;quot;raw&amp;quot; may be specified inside the body's JSON representation to signal that the text content shall be kept as-is; meaning to keep all formatting intact&lt;br /&gt;
&lt;br /&gt;
==== Attach data sources ====&lt;br /&gt;
Moreover the JSON representation may contain data sources which should be appended as file attachments to the mail. Then the mail contains the &amp;lt;code&amp;gt;&amp;quot;datasources&amp;quot;&amp;lt;/code&amp;gt; key which is expected to be a JSON array of data source descriptions.&lt;br /&gt;
&lt;br /&gt;
A data source description follows the [[#Module_.22conversion.22_.28preliminary.29 | conversion specification]].&lt;br /&gt;
&lt;br /&gt;
For example to attach a file through an URL the field looks like this (available with v6.18.2):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;from&amp;quot;: &amp;quot;someone@somewhere.com,&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;quot;datasources&amp;quot;&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;identifier&amp;quot;: &amp;quot;com.openexchange.url.mail.attachment&amp;quot;,&lt;br /&gt;
   &amp;quot;args&amp;quot;:&lt;br /&gt;
    {&lt;br /&gt;
     &amp;quot;url&amp;quot;: &amp;lt;url-string&amp;gt;,&lt;br /&gt;
     &amp;quot;timeout&amp;quot;: &amp;lt;optional-timeout-millis-int, default is 2500msec&amp;gt;,&lt;br /&gt;
     &amp;quot;contentType&amp;quot;: &amp;lt;optional-content-type-string&amp;gt;,&lt;br /&gt;
     &amp;quot;charset&amp;quot;: &amp;lt;optional-charset-string&amp;gt;,&lt;br /&gt;
     &amp;quot;size&amp;quot;: &amp;lt;optional-size-int&amp;gt;,&lt;br /&gt;
     &amp;quot;disposition&amp;quot;: &amp;lt;optional-disposition-string&amp;gt;,&lt;br /&gt;
     &amp;quot;fileName&amp;quot;: &amp;lt;optional-file-name-string&amp;gt;,&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created mail.&lt;br /&gt;
&lt;br /&gt;
=== Send/Save mail as MIME data block (RFC822) (added in SP5) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) - In case the mail should not be sent out, but saved in a specific folder, the &amp;quot;folder&amp;quot; parameter can be used. If the mail should be sent out to the recipient, the &amp;quot;folder&amp;quot; parameter must not be included and the mail is stored in the folder &amp;quot;Sent Items&amp;quot;. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. If no &amp;quot;folder&amp;quot;  parameter is specified, this parameter must not be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
 &lt;br /&gt;
Request Body: The MIME Data Block&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created/moved mail.&lt;br /&gt;
&lt;br /&gt;
=== Import of mails as MIME data block (RFC822) (added with 6.18) ===&lt;br /&gt;
&lt;br /&gt;
This request can be used to store a single or a lot of mails in the OX mail storage backend. This action should be used instead of &amp;lt;code&amp;gt;action=new&amp;lt;/code&amp;gt; because it is faster and tolerant to 8bit encoded emails.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /ajax/mail?action=import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - For the import this parameter is required to specify the folder into that the emails should be imported. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
*&amp;lt;code&amp;gt;force&amp;lt;/code&amp;gt; (optional) - If this parameter is set to true, the server skips checking the valid From-address&lt;br /&gt;
 &lt;br /&gt;
Request Body: A multipart/form-data with a single or multiple file parts each having a different name and containing the RFC822 encoded email as binary data like in a file upload.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the folder identifier and the object identifier of the imported mail or a JSON array of those JSON objects if multiple mails are imported.&lt;br /&gt;
&lt;br /&gt;
=== Reply/Forward a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=forward&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested Message.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP6) - &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML. &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).'''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;setFrom&amp;lt;/code&amp;gt; (optional - available since v7.6.0) A flag (&amp;quot;true&amp;quot;/&amp;quot;false&amp;quot;) that signals if &amp;quot;From&amp;quot; header shall be pre-selected according to a suitable recipient address that matches one of user's E-Mail address aliases; only supported for &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included.&lt;br /&gt;
&lt;br /&gt;
=== Delete mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects providing folder IDs and object IDs of the deleted mails.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/INBOX&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;123&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/MyFolder&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;134&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not IMAP: Response: An array with object IDs of mails which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Clear mail folder(s) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=clear&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with IDs of the mail folders to clear&lt;br /&gt;
&lt;br /&gt;
Response: An array with IDs of mail folder that could not be cleared; meaning the response body is an empty JSON array if everything went well.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge receipt ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=receipt_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the &amp;quot;from address&amp;quot;, the id of the folder and the mail id: e.g.: {&amp;quot;from&amp;quot;:&amp;quot;mymail@domain.com&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;1234&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object with an empty data field if everything went well or a JSON object containing the error information.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;groups&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The group module allows to query available groups. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get a group ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The group id.&lt;br /&gt;
&lt;br /&gt;
Response: A group object as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== List groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with group identifiers.&lt;br /&gt;
&lt;br /&gt;
Response: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== Search for groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#GroupSearch | Group search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find groups. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group data&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name         || String || Name with character restrictions&lt;br /&gt;
|-&lt;br /&gt;
| members       || Array  || The array contains identifier of users that are member of the group.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created group.&lt;br /&gt;
&lt;br /&gt;
=== Delete a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the group to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the group.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the group was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the group to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the group to update. If the group was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested groups.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted groups. New, modified and deleted groups are represented by JSON objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;resource&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The resource module allows to query available resources. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get all resources ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource identifier.&lt;br /&gt;
&lt;br /&gt;
=== List resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An array with resources ids.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Get a resource ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The resource id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Search for resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#ParticipantSearch | Participant search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ParticipantSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find resources. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResourceResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Resource Response&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name || String || internal name&lt;br /&gt;
|-&lt;br /&gt;
| mailaddress || String || email address&lt;br /&gt;
|-&lt;br /&gt;
| availability || Boolean || can be false to mark the resource currently unavailable&lt;br /&gt;
|-&lt;br /&gt;
| description || String || description of the resource&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified_utc || Timestamp || Date and time of the last modification.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: An object with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created resource.&lt;br /&gt;
&lt;br /&gt;
=== Delete a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resource was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Delete resources (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resources were deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the resource to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the resource to update. If the resource was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested resources.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted resources. New, modified and deleted resources are represented by JSON objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;infostore&amp;quot; or &amp;quot;Filestore&amp;quot; or &amp;quot;Files&amp;quot; or &amp;quot;Drive&amp;quot; ==&lt;br /&gt;
This module has been renamed quite often. Whatever its name, it combines the knowledge database, bookmarks and document storage.&lt;br /&gt;
&lt;br /&gt;
=== Get all infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedInfoitemData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed infoitem data&lt;br /&gt;
! ID  !! Name            !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 108 || object_permissions           || Array  || Each element is an object described in [[#ObjectPermissionObject | Object Permission object]] (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 109 || shareable       || Boolean || (read-only) Indicates if the item can be shared (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 700 || title           || String  || Title&lt;br /&gt;
|-&lt;br /&gt;
| 701 || url             || String  || Link/URL&lt;br /&gt;
|-&lt;br /&gt;
| 702 || filename        || String  || Displayed filename of the document.&lt;br /&gt;
|-&lt;br /&gt;
| 703 || file_mimetype   || String  || MIME type of the document. The client converts known types to more readable names before displaying them.&lt;br /&gt;
|-&lt;br /&gt;
| 704 || file_size       || Number  || Size of the document in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 705 || version         || Number  || Version number of the document. New documents start at 1. Every update increments the version by 1.&lt;br /&gt;
|-&lt;br /&gt;
| 706 || description     || String  || Description&lt;br /&gt;
|-&lt;br /&gt;
| 707 || locked_until    || Time    || The time until which this item will presumably be locked. Only set if the docment is currently locked, 0 otherwise.&lt;br /&gt;
|-&lt;br /&gt;
| 708 || file_md5sum     || String  || MD5Sum of the document. Not yet implemented, so this is currently always empty.&lt;br /&gt;
|-&lt;br /&gt;
| 709 || version_comment || String  || A version comment is used to file a changelog for the file.&lt;br /&gt;
|-&lt;br /&gt;
| 710 || current_version || Boolean || “true” if this version is the current version “false” otherwise. Note: This is not writeable&lt;br /&gt;
|-&lt;br /&gt;
| 711 || number_of_versions || Number || The number of all versions of the infoitem. Note: This is not writeable.&lt;br /&gt;
|-&lt;br /&gt;
| 7010 || com.openexchange.share.extendedObjectPermissions || Array || Each element is an object described in [[#ExtendedObjectPermissionObject | Extended object permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 7020 || com.openexchange.realtime.resourceID || String || The resource identifier for the infoitem for usage within the realtime component. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies.&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user.&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended object permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || The numerical value indicating no object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || The numerical value indicating read object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || The numerical value indicating write object permissions. This implicitly includes the “read” permission (this is no bitmask).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of requested infoitems.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted infoitems. New and modified infoitems are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted infoitems (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested infoitem. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Search infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) – The folder ID to restrict the search to. If not specified, all folders are searched.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields as per tables [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; (optional) – The start index (inclusive) in the ordered search, that is requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; (optional) – The last index (inclusive) from the ordered search, that is requested.&lt;br /&gt;
&lt;br /&gt;
Request body: The search pattern string in a JSON object named &amp;quot;pattern&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem document ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt;(optional) – If present the response declares the given content_type in the Content-Type header.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem or the content_type given.&lt;br /&gt;
&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get a ZIP archive containing the infoitems of a denoted folder (available with v7.6.1) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=zipfolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;recursive&amp;lt;/code&amp;gt; – &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to also include subfolders and their infoitems respectively; otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to only consider the infoitems of specified folder&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP archive. The response type for the HTTP Request is set to &amp;lt;code&amp;gt;application/zip&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Get all versions ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=versions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem whose versions are requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. The timestamp is the timestamp relating to the requested infostore item.&lt;br /&gt;
&lt;br /&gt;
=== Check if file name is valid (since 7.8.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=checkname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – Name of the file to check.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object when file name is valid.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple documents as a ZIP archive (available with v7.4.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=zipdocuments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; – A URL-encoded JSON array; see below for details&lt;br /&gt;
&lt;br /&gt;
Parameter &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;: A JSON array of JSON object tuples specifying the documents' versions to include in the requested ZIP archive; e.g&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[{&amp;quot;id&amp;quot;:&amp;quot;61820&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;61821&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;}]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The field &amp;lt;code&amp;gt;&amp;quot;version&amp;quot;&amp;lt;/code&amp;gt; is optional; if missing it refers to latest/current version.&amp;lt;br&amp;gt;&lt;br /&gt;
So, a valid parameter would look like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;body=%5B%7B%22id%22%3A%2261820%22%2C%22folder%22%3A%2270303%22%7D%2C%7B%22id%22%3A%2261821%22%2C%22folder%22%3A%2270303%22%2C%22version%22%3A%221%22%7D%5D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The download offer for the requested ZIP archive containing specified document versions&lt;br /&gt;
&lt;br /&gt;
=== Move one or more infoitems via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=move&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the destination folder.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array consisting of JSON objects each referencing to an existing infoitem that is supposed to be moved to the destination folder&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36639&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;},&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36641&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array consisting of those identifiers that could not be moved (due to a conflict) or an empty JSON array if everything went fine&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; – Optionally sets the start offset in bytes where to append the data to the document, must be equal to the actual document's length (available with v7.8.1). Only available if the underlying [[#FileStorageAccount | File storage account]] supports the &amp;quot;RANDOM_FILE_ACCESS&amp;quot; capability.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem. The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Save an attachment in the infostore ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=saveAs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object with the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;Attachment&amp;lt;/code&amp;gt; – The id of the attachement to save.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. The fields in this infoitem object override values from the attachment. The folder_id must be given. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Delete infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the file is deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the file is not yet located below the trash folder, it is moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects to delete. The fields for the object are described in [[#FullIdentifierForAnInfostoreDocument|Full identifier for an infostore document]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with [[]]. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnInfostoreDocument&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an infostore document&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || Folder ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: A List of arrays with the version numbers of the infoitems to detach.&lt;br /&gt;
&lt;br /&gt;
Response: An array with version numbers that were not deleted.&lt;br /&gt;
&lt;br /&gt;
Note: When the current version of a document is deleted the new current version will be the newest version.&lt;br /&gt;
&lt;br /&gt;
=== Delete all versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=revert&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Removes all versions of the infostore document leaving only the base object.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
Response: The id of the newly created object&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Lock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=lock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be locked.&lt;br /&gt;
* &amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt; (optional) – If present the value is added to the current time on the server (both in ms). The document will be locked until that time. If this parameter is not present, the document will be locked for a duration as configured on the server.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only include errors.&lt;br /&gt;
&lt;br /&gt;
=== Unlock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=unlock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be unlocked.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only contain errors.&lt;br /&gt;
&lt;br /&gt;
=== Get shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared infoitem to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;Attachments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Attachment Module allows file attachments to arbitrary objects. An Attachment always belongs to an object (called 'attached') in a certain folder of a certain module.  &lt;br /&gt;
&lt;br /&gt;
=== Get All Attachments for an Object ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachment's are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of attachments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Create an Attachment ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/attachment?action=attach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json_[index]&amp;lt;/code&amp;gt; – The JSON representation of an attachment object as described in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;file_[index]&amp;lt;/code&amp;gt; – The file metadata as per &amp;lt;input type=file /&amp;gt; upload.&lt;br /&gt;
&lt;br /&gt;
Note: The JSON Object and file fields describe the corresponding attachment. For ex.: json_0 contains metadata for file_0, json_1 for file_1 and so on. Indexes start with 0.&lt;br /&gt;
&lt;br /&gt;
Request body: multipart/form-data or multipart/mixed containing the file data of the attached file and the above fields.&lt;br /&gt;
&lt;br /&gt;
Response: HTML page with javascript callback as per introduction. Contains a JSON-Array of ids of the newly created attachments. The order of the ids corresponds to the indexes in the request.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AttachmentObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment Object&lt;br /&gt;
! ID  !! Name          !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 800 || folder        || Number  || The ID of the first Folder in which the attached object resides.&lt;br /&gt;
|-&lt;br /&gt;
| 801 || attached      || Number  || The object id of the object this attachement is attached to.&lt;br /&gt;
|-&lt;br /&gt;
| 802 || module        || Number  || The Module of this Object Possible Values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1   || Appointment&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Task&lt;br /&gt;
|-&lt;br /&gt;
| 7   || Contact&lt;br /&gt;
|-&lt;br /&gt;
| 137 || Infostore&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 803 || filename      || String  || The filename of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 804 || file_size     || Number  || The file size (in bytes) of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 805 || file_mimetype || String  || The MIME-Type of the attached file&lt;br /&gt;
|-&lt;br /&gt;
| 806 || rft_flag      || Boolean || If the attachment is a RTF Attachment of Outlook. (Outlook descriptions can be stored as RTF Documents).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete Attachment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ids of the attachments to delete.&lt;br /&gt;
&lt;br /&gt;
=== Get updated attachments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
ignore (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new and deleted attachments for the specified object. New attachments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted attachments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain numbers, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attahment?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested attachment. The fields of the object are listed in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]]. &lt;br /&gt;
&lt;br /&gt;
=== Get an attachments filedata ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; (optional) – If set the responses Content-Type header is set to this value, not the attachements file mime type.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem.&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;reminder&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The reminder module provides the ability to fetch all active reminders for a user between two dates.&lt;br /&gt;
&lt;br /&gt;
=== Get reminder range ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/reminder?action=range&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The End date of the reminder range&lt;br /&gt;
&lt;br /&gt;
Response: An Array with all reminders which are scheduled until the specified time. Each reminder is described in [[#ReminderResponse | Reminder response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ReminderResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Reminder response&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The ID of the reminder.&lt;br /&gt;
|-&lt;br /&gt;
| target_id || Number || The target_id where this reminder is attached to&lt;br /&gt;
|-&lt;br /&gt;
| alarm     || Time   || The time of the alarm&lt;br /&gt;
|-&lt;br /&gt;
| module    || Number || The module of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| servertime || Time || The time on the server&lt;br /&gt;
|-&lt;br /&gt;
| user_id || Number || The ID of the user.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || The last modification timestamp of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| recurrence_position || Number || The recurrence position for series appointments or 0 if no series&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || The ID of the folder through that the object can be read&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete a Reminder===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the id that was not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete Reminders (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the ids that were not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Remind again (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=remindAgain&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the reminder whose date shall be changed.&lt;br /&gt;
&lt;br /&gt;
Request body: The JSON representation of the reminder; mainly containing the field “alarm” which provides the new reminder date.&amp;lt;br&amp;gt;&lt;br /&gt;
E.g. &amp;lt;code&amp;gt;{ &amp;quot;alarm&amp;quot;: 1283418027381 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response body: The JSON representation of the updated reminder.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;multiple&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The multiple module allows to bundle multiple requests to most other modules in a single request. Not supported are:&lt;br /&gt;
* modules login and multiple,&lt;br /&gt;
* POST requests with a multipart encoding (uploads),&lt;br /&gt;
* GET requests which do not use an object as described in [[#ResponseBody | Response body]] as response body (downloads).&lt;br /&gt;
&lt;br /&gt;
=== Multiple requests ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/multiple&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;continue&amp;lt;/code&amp;gt; – Specifies whether processing of requests should stop when an error occurs, or whether all request should be processed regardless of errors.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with request objects. Each request object contains all URI parameters of the &amp;quot;normal&amp;quot; request as fields. The module name of the &amp;quot;normal&amp;quot; request is included in the field module. The parameter session is not included. If the &amp;quot;normal&amp;quot; request has a request body, the object which is represented by that request body is includes as the value of the field data.&lt;br /&gt;
&lt;br /&gt;
Response: An array with reply objects as described in [[#ResponseBody | Response body]]. The order of reply objects corresponds to the order of requests in the request body. Unlike with all other modules, this response is itself not part of a response object as described in [[#ResponseBody | Response body]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;quota&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The filestore module allows accesssing information about the use and quota of the filestore.&lt;br /&gt;
&lt;br /&gt;
=== Get quota information (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; (optional) – The module identifier to get quota information for, required if &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; is set.&lt;br /&gt;
* &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; (optional) – The account identifier within the module to get quota information for.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the requested quota information. If no &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was specified, all defined [[#ModuleQuota | module quotas]] are set in the JSON object, each one mapped to it's module identifier. If the quota from a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was requested, a JSON array containing all [[#AccountQuota | account quotas]] of this module are returned. If both a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; were requested, a JSON object representing this specific [[#AccountQuota | account auota]] is returned. &lt;br /&gt;
&lt;br /&gt;
Note: In case there is no quota limitation defined for a module or account, no corresponding JSON object is included in the response. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ModuleQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Module Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || The display name of the module&lt;br /&gt;
|-&lt;br /&gt;
| accounts|| Array || Each element identifies an account quota within the module, as described in [[#AccountQuota | Account Quota]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AccountQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Account Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| account_id || String || Identifier of the account&lt;br /&gt;
|-&lt;br /&gt;
| account_name || String || Name of the account&lt;br /&gt;
|-&lt;br /&gt;
| countquota || Number || The account's quota limit for the number of items, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| countuse || Number || The account's actual usage for the number of items, or not set if no count quota defined&lt;br /&gt;
|-&lt;br /&gt;
| quota || Number || The account's quota limit for the storage in bytes, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The account's actual usage for the storage in bytes, or not set if no storage quota defined&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get the filestore usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=filestore&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the uploaded files sizes sum and the field “quota” represents the maximum.&lt;br /&gt;
&lt;br /&gt;
=== Get the mail usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the use mail quota and the field “quota” represents the maximum. -1 represents an unlimited quota.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;import&amp;quot;==&lt;br /&gt;
The module import allows to import specific module data (like Contacts, Tasks or Appointments) in several formats (iCal, vCard, CSV) into a folder. Please note: The callback for all actions of this bundle is callback_import, not callback_$actionname for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
=== Import CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: A &amp;quot;multipart/form-data&amp;quot; encoded .CSV file. The field name for the file is &amp;quot;file&amp;quot;. The column titles of the table are those used within the OX, see column ''Displayed Name'' in [[#DetailedContactData]].&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import Outlook CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=OUTLOOK_CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: An .CSV file with Windows' default encoding Windows-1252. The column titles of the table may be those used by the English, French or German version of Outlook.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import iCAL ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This may be an Appointment or a Task folder. May even be a list containing both.&lt;br /&gt;
* &amp;lt;code&amp;gt;suppressNotification&amp;lt;/code&amp;gt; – This optional parameter can be used to disable the notifications for new appointments that are imported through the given iCal file. This help keeping the Inbox clean if a lot of appointments need to be imported. The value of this parameter does not matter because only for the existence of the parameter is checked.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignoreUIDs&amp;lt;/code&amp;gt; – Optional. When set to &amp;quot;true&amp;quot;, UIDs are partially ignored during import of tasks and appointments from iCal. Internally, each UID is replaced statically by a random one to preserve possibly existing relations between recurring appointments in the same iCal file, but at the same time to avoid collisions with already existing tasks and appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An iCalendar file.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered, and warnings (under the key &amp;quot;warnings&amp;quot;) containing an Array of objects with the warning data, containing all customary error fields.&lt;br /&gt;
&lt;br /&gt;
=== Import vCard ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An vCard file, maybe of the formats: vCard 2.1, vCard 3.0 or vCalendar 1.0&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;export&amp;quot; ==&lt;br /&gt;
The module export allows to export specific module data (like Contacts, Tasks or Appointments) from a folder in several formats (iCal, vCard, CSV).&lt;br /&gt;
&lt;br /&gt;
=== Exporting CSV ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – (optional) Columns to be imported from the given file, given as an array of column numbers. See [[#DetailedContactData | Detailed contact data]] for numbers.&lt;br /&gt;
* &amp;lt;code&amp;gt;export_dlists&amp;lt;/code&amp;gt; – (optional) toggles whether distribution lists are exported, too. Default is false. Option exists since 7.4.1.&lt;br /&gt;
Response: An InputStream containing the file of the MIME type &amp;lt;code&amp;gt;text/csv&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting iCAL ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Calendar folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/calendar&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting vCard ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/x-vcard&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;sync&amp;quot; ==&lt;br /&gt;
The module sync delivers several core API extensions to support common operations used in a mobile synchronization environment.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/sync?action=refresh_server&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;token&amp;quot; (since 7.4.0) ==&lt;br /&gt;
The module token delivers several core API extensions to support token based logins.&lt;br /&gt;
&lt;br /&gt;
=== Get a login token ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/token?action=acquireToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON object with the timestamp of the creation date and a token which can be used to create a new session.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mailfilter&amp;quot; ==&lt;br /&gt;
The module mailfilter describes how to add, update or delete mail filter rules or to check which actions are supported by the underlying system.&lt;br /&gt;
&lt;br /&gt;
A detailed description can be found here [[ HTTP_API_MailFilter | Mail Filter HTTP API]]&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;ajax file upload&amp;quot; ==&lt;br /&gt;
This module offers to store files in server's dedicated download directory for a configureable amount of time. The files are then accessible for further operations like inline images in (html) mails&lt;br /&gt;
&lt;br /&gt;
=== Uploading a file ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/file?action=new&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The module for which the file is uploaded to determine proper upload quota constraints (e.g. &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;, etc.).&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; – The file type filter to define which file types are allowed during upload. Currently supported filters are: &amp;lt;code&amp;gt;file=all, text=text/*, media=image OR audio OR video, image=image/*, audio=audio/*, video=video/*, application=application/*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A common POST request body of MIME type &amp;quot;multipart/*&amp;quot; which holds the file(s) to upload&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of the uploaded files. The files are accessible through the returned IDs for future use.&lt;br /&gt;
&lt;br /&gt;
=== Updating a file's last access timestamp (keep alive) ===&lt;br /&gt;
By updating the last access timestamp it's prevented from being deleted from both session and disk storage.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=keepalive&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file whose timestamp should be updated&lt;br /&gt;
&lt;br /&gt;
Response: The string &amp;quot;null&amp;quot; in response's data element&lt;br /&gt;
&lt;br /&gt;
=== Requesting a formerly uploaded file ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested file is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;image&amp;quot; ==&lt;br /&gt;
This module allows to download images from Open-Xchange server without providing a session ID in request's URL parameters.&lt;br /&gt;
&lt;br /&gt;
=== Requesting an image ===&lt;br /&gt;
Open-Xchange Server supports multiple image sources that are identified through request's path identifier&lt;br /&gt;
&lt;br /&gt;
* Inline images from mails&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mail/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Contact profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/contact/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* User profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/user/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* MP3 cover image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/file/mp3cover&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Fetch a previously uploaded image using &amp;lt;code&amp;gt;&amp;quot;/ajax/file&amp;quot;&amp;lt;/code&amp;gt; interface&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mfile/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each image source requires an individual set of required parameters&lt;br /&gt;
&lt;br /&gt;
==== Inline images from mails ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/mail/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;accountId&amp;lt;/code&amp;gt; – The mail account identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the mail resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The mail identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the image inside the referenced mail&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Contact profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/contact/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the contact resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The contact identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== User profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/user/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The user identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MP3 cover image ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/file/mp3cover&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Managed Image File ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/image/mfile/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;conversion&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
A generic module to request data from a data source and to process obtained/submitted data with a data handler. Thus data is converted from a data source by a data handler.&lt;br /&gt;
&lt;br /&gt;
=== Converting data ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
or&amp;lt;br&amp;gt;&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters: &amp;amp;lt;no parameters required&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A [[#ConversionRequest | conversion request]] JSON object containing nested JSON objects for [[#DataSource | data source]] and [[#DataHandler | data handler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConversionRequest&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Conversion request object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| datasource || JSON object || The data source object.&lt;br /&gt;
|-&lt;br /&gt;
| datahandler || JSON object || The data handler object.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSource&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data source object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data source.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data source&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataHandler&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data handler object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data handler.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data handler&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: The result of converted data ready as an appropriate JSON response&lt;br /&gt;
&lt;br /&gt;
==== Saving an ICal email attachment ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can be saved as appointments and tasks into given calendar and task folder.&lt;br /&gt;
If the fields &amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;quot; and &amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;quot; are set, the data handler inserts the appointment with the given status for the user, if the appointment does not exist. If it is already existing, the handler just updates the participant status.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;calendar-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.task.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;task-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;status&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;message&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added appointment/task; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Converting an ICal email attachment into JSON objects ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can converted to JSON appointments and tasks.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Note''' that all arguments are optional: Default is user time zone and zero recurrence position&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;com.openexchange.groupware.calendar.searchobject&amp;quot; triggers a search for the uid, and replaces the object_id and folder_id with the data of the corresponding ox-object id, if existing. The returned objects are still the ical objects and NOT the ox-objects.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical.json&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.timezone&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;timezone-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.recurrencePosition&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;recurrence-position&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.searchobject&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;true|false&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects for each appointment/task as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]/[[##DetailedAppointmentData | Detailed appointment data]]&lt;br /&gt;
&lt;br /&gt;
==== Saving a VCard email attachment ====&lt;br /&gt;
&lt;br /&gt;
If a VCard file is attached to an email, its content can be saved as contacts into given contact folder.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.contact.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;contact-folder-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added contact; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contact(s) attached to a new email as a VCard file ====&lt;br /&gt;
&lt;br /&gt;
Obtain VCard data from specified contact object(s).&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-id1&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;id1&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-idn&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;idn&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Get a new email's JSON object with specified VCard data source attached.&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:[]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A [[#DetailedMailData | mail]] JSON object.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:{search-term-object}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&amp;lt;br&amp;gt;&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[...]}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moreover there are two different types of a search terms:&lt;br /&gt;
* A single search term&lt;br /&gt;
* A composite search term&lt;br /&gt;
&lt;br /&gt;
A single search term reflects an operation which cannot hold nested search terms as operands; e.g. &amp;quot;equals&amp;quot;. In opposite to this a composite search term holds one or more nested search terms as operands; e.g. &amp;quot;not&amp;quot; or the logical junctors &amp;quot;and&amp;quot;/&amp;quot;or&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
By now the following operations are supported:&lt;br /&gt;
* composite operations&lt;br /&gt;
** &amp;quot;and&amp;quot; - The AND junctor&lt;br /&gt;
** &amp;quot;or&amp;quot; - The OR junctor&lt;br /&gt;
** &amp;quot;not&amp;quot; - Negation&lt;br /&gt;
* single operations&lt;br /&gt;
** &amp;quot;equals&amp;quot; - Equals comparison&lt;br /&gt;
** &amp;quot;lt&amp;quot; - Less-than comparison&lt;br /&gt;
** &amp;quot;gt&amp;quot; - Greater-than comparison&lt;br /&gt;
&lt;br /&gt;
Furthermore following operand types are supported for single search terms:&lt;br /&gt;
* Column - Providing a name referring to a field/column&lt;br /&gt;
* Constant - A constant&lt;br /&gt;
&lt;br /&gt;
Example of an EQUALS search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of an OR search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;or&amp;quot;,&amp;quot;operands&amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;gt&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;birthday&amp;quot;},&amp;quot;1975-05-01&amp;quot;]}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Refer to object data tables introduced by different modules to know which field names are supported; e.g. for tasks it is [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]], and [[#DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (alternative suggestion, still preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:&amp;lt;i&amp;gt;[search term]&amp;lt;/i&amp;gt;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[&amp;quot;&amp;gt;&amp;quot;, 5, 2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The available operators are:&lt;br /&gt;
* Comparison operators &amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;=&amp;quot;, &amp;quot;&amp;lt;=&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
* logic operators &amp;quot;not&amp;quot;, &amp;quot;and&amp;quot;, &amp;quot;or&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Comparison operators have exactly two operands. Each operand can be either a field name or a constant. A field name is an object with the member &amp;quot;field&amp;quot; specifying the field name, e.g. &amp;lt;code&amp;gt;{ field: &amp;quot;first_name&amp;quot; }&amp;lt;/code&amp;gt;. The available field names depend on the searched module. Primitive JSON types are interpreted as constants. Arrays are not valid operands for comparison operators.&lt;br /&gt;
&lt;br /&gt;
The logic operator &amp;quot;not&amp;quot; has exactly one operand, the other logic operators can have any number of operands. Each operand must be an array representing a nested search expression.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail account&amp;quot; (available with v6.12) ==&lt;br /&gt;
&lt;br /&gt;
The mail account module is used to manage multiple mail accounts held by a user.&lt;br /&gt;
&lt;br /&gt;
=== Get All mail accounts  ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mail account's are defined in [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one mail account and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail account ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the account to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the desired mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MailAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Mail account data&lt;br /&gt;
! ID    !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  1001   || id            || Number  || Account ID&lt;br /&gt;
|-&lt;br /&gt;
|  1002   ||  login    || String  || The login.&lt;br /&gt;
|-&lt;br /&gt;
|  1003   ||  password   || String  || The (optional) password.&lt;br /&gt;
|-&lt;br /&gt;
|  1004   ||  mail_url || String    || The mail server URL; e.g. &amp;quot;imap://imap.somewhere.com:143&amp;quot;. '''URL is preferred over single fields''' (like mail_server, mail_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|  1005   ||  transport_url || String    || The transport server URL; e.g. &amp;quot;smtp://smtp.somewhere.com:25&amp;quot;. '''URL is preferred over single fields''' (like transport_server, transport_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|   1006  ||  name || String    || Account's display name.&lt;br /&gt;
|-&lt;br /&gt;
|  1007   ||  primary_address || String    || User's primary address in account; e.g. &amp;quot;someone@somewhere.com&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|  1008   ||  spam_handler || String    || The name of the spam handler used by account.&lt;br /&gt;
|-&lt;br /&gt;
|   1009  ||  trash || String    || The name of the default trash folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1010   ||  sent || String    || The name of the default sent folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1011  ||  drafts || String    || The name of the default drafts folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1012   ||  spam || String    || The name of the default spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1013   ||  confirmed_spam || String    || The name of the default confirmed-spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1014  || confirmed_ham || String    || The name of the default confirmed-ham folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1015  ||  mail_server || String    || The mail server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1016  ||  mail_port || Number    || The mail server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1017  ||  mail_protocol || String    || The mail server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;imap&amp;quot; instead of &amp;quot;imaps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1018  ||  mail_secure || Boolean    || Whether to establish a secure connection to mail server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1019  ||  transport_server || String    || The transport server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1020  ||  transport_port || Number    || The transport server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1021  ||  transport_protocol || String    || The transport server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;smtp&amp;quot; instead of &amp;quot;smtps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1022  ||  transport_secure || Boolean    || Whether to establish a secure connection to transport server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1023  ||  transport_login || String    || The transport login. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1024  ||  transport_password || String    || The transport password. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1025  ||  unified_inbox_enabled || Boolean    || If enabled for Unified INBOX&lt;br /&gt;
|-&lt;br /&gt;
|   1026  ||  trash_fullname || String    || Path to default trash folder. Preferred over &amp;quot;trash&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1027  ||  sent_fullname || String    || Path to default sent folder. Preferred over &amp;quot;sent&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1028  ||  drafts_fullname || String    || Path to default drafts folder. Preferred over &amp;quot;drafts&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1029  ||  spam_fullname || String    || Path to default spam folder. Preferred over &amp;quot;spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1030  ||  confirmed_spam_fullname || String    || Path to default confirmed-spam folder. Preferred over &amp;quot;confirmed_spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1031  ||  confirmed_ham_fullname || String    || Path to default confirmed-ham folder. Preferred over &amp;quot;confirmed_ham&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1032  ||  pop3_refresh_rate || Number    || The interval in minutes the POP3 account is refreshed&lt;br /&gt;
|-&lt;br /&gt;
|   1033  ||  pop3_expunge_on_quit || Boolean    || Whether POP3 messages shall be deleted on actual POP3 account after retrieval or not&lt;br /&gt;
|-&lt;br /&gt;
|   1034  ||  pop3_delete_write_through || Boolean    || If option &amp;quot;pop3_expunge_on_quit&amp;quot; is disabled, this property defines whether a delete in local INBOX also deletes affected message in actual POP3 account&lt;br /&gt;
|-&lt;br /&gt;
|   1035  ||  pop3_storage || String    || The name of POP3 storage provider, default is &amp;quot;mailaccount&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1036  ||  pop3_path || String    || Path to POP3's virtual root folder in storage, default is name of the POP3 account beside default folders&lt;br /&gt;
|-&lt;br /&gt;
|   1037  ||  personal || String    || The customizable personal part of email address&lt;br /&gt;
|-&lt;br /&gt;
|   1038  ||  reply_to || String    || The customizable reply-to email address&lt;br /&gt;
|-&lt;br /&gt;
|   1039  ||  addresses || String    || The comma-separated list of available E-Mail addresses including aliases. !! Only available for primary mail account !!&lt;br /&gt;
|-&lt;br /&gt;
|   1040  ||  meta || JSON data    || Stores arbitrary JSON data as specified by client associated with the mail account&lt;br /&gt;
|-&lt;br /&gt;
|   1041  ||  archive || String    || The name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1042  ||  archive_fullname || String    || The full name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1043  ||  transport_auth || String    || '''Available since v7.6.1''' Specifies the source for mail transport (SMTP) credentials. Possible values: &amp;quot;mail&amp;quot;, &amp;quot;custom&amp;quot;, and &amp;quot;none&amp;quot;.&amp;lt;br&amp;gt;- &amp;quot;mail&amp;quot; signals to use the same credentials as given in associated mail store (IMAP, POP3).&amp;lt;br&amp;gt;- &amp;quot;custom&amp;quot; signals that individual credentials are supposed to be used (fields &amp;quot;transport_login&amp;quot; and &amp;quot;transport_password&amp;quot; are considered).&amp;lt;br&amp;gt;- &amp;quot;none&amp;quot; means the mail transport does not support any authentication mechanism (rare case!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a new mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to create. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the inserted mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object identifiying (field ID is present) and describing the account to update. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the updated mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ID of the mail account to delete.&lt;br /&gt;
&lt;br /&gt;
=== Validate a mail account (which shall be created) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=validate&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; - An optional boolean parameter which indicates whether on successful validation the folder tree shall be returned (NULL on failure) or if set to &amp;quot;false&amp;quot; or missing only a boolean is returned which indicates validation result&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to validate. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: Dependent on optional &amp;quot;tree&amp;quot; parameter a JSON folder object or a boolean value indicating the validation result&lt;br /&gt;
&lt;br /&gt;
The JSON folder object corresponding to [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
Additionally a field &amp;quot;subfolder_array&amp;quot; is added which contains possible subfolders. This field is missing if a folder contains no subfolders.&lt;br /&gt;
&lt;br /&gt;
[[Category: OX6]]&lt;br /&gt;
&lt;br /&gt;
== Module Auto Configuration (since 6.22) ==&lt;br /&gt;
&lt;br /&gt;
=== Get Auto Configuration ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/autoconfig?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
application/x-www-form-urlencoded parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; – Email Adress for which a mail configuration will be discovered.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – Corresponding password for the mail account (optional)&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the best available settings for an appropriate mail Server for the given email address. The fields are described in [[#MailAccountData | mail account data]]. The Data may be incomplete or even empty.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user&amp;quot; (available with v6.14) ==&lt;br /&gt;
&lt;br /&gt;
The user module is used to access user information.&lt;br /&gt;
&lt;br /&gt;
=== Get all users ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedUserData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed user data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type       !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 610 || Aliases                     || aliases              || Array      || The user's aliases&lt;br /&gt;
|-&lt;br /&gt;
| 611 || Time zone                   || timezone             || String     || The time zone ID.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || Locale                      || locale               || String     || The name of user's entire locale, with the language, country and variant separated by underbars. E.g. &amp;quot;en&amp;quot;, &amp;quot;de_DE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 613 || Groups                      || groups               || Array      || The IDs of user's groups&lt;br /&gt;
|-&lt;br /&gt;
| 614 || Contact ID                  || contact_id           || Number     || The contact ID of the user&lt;br /&gt;
|-&lt;br /&gt;
| 615 || Login info                  || login_info           || String     || The user's login information&lt;br /&gt;
|-&lt;br /&gt;
| 616 || Guest Created By            || guest_created_by     || Number     || The ID of the user who has created this guest in case this user represents a guest user; it is 0 for regular users (preliminary, available with v7.8.0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of numbers. Each number is the ID of requested user. Since v6.18.1, a &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; value in the array is interpreted as the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a user ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested user. Since v6.18.1, this parameter is optional: the default is the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested user. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a user ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated user.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated user. If the user was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: User object as described in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
'''Note''': &amp;quot;timezone&amp;quot; and &amp;quot;locale&amp;quot; are the only fields from [[#DetailedUserData | Detailed user data]] which are allowed to be updated.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty object.&lt;br /&gt;
&lt;br /&gt;
=== Search users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected users with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchUsers | Search users]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsers&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find users. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search users with the given startletter. If this field is present, the pattern is matched against the user field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchUsersAlternative | Search users alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsersAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches users where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches users where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches users where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, the fields are connected through an OR search habit.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed by connecting the relevant fields through an OR search habit.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=getAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The attribute name. &lt;br /&gt;
&lt;br /&gt;
Response without timestamp: A JSON object providing name and value of the requested attribute&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=setAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;setIfAbsent&amp;lt;/code&amp;gt; - Set to &amp;quot;true&amp;quot; to put the value only if the specified name is not already associated with a value, otherwise &amp;quot;false&amp;quot; to put value in any case&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing name and value of the attribute. If the &amp;lt;code&amp;gt;&amp;quot;value&amp;quot;&amp;lt;/code&amp;gt; field id missing or NULL, the attribute is removed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if PUT was successful; otherwise &amp;quot;false&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user/me&amp;quot; (available with v7.6.2) ==&lt;br /&gt;
&lt;br /&gt;
The user/me module is used to access formal information about current user.&lt;br /&gt;
&lt;br /&gt;
=== Get user information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user/me&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object providing information for current user&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;context_id&amp;quot;: 1234,&lt;br /&gt;
        &amp;quot;user_id&amp;quot;: 5,&lt;br /&gt;
        &amp;quot;is_context_admin&amp;quot;: false,&lt;br /&gt;
        &amp;quot;login_name&amp;quot;: &amp;quot;user5&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;: &amp;quot;User Five&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: 1400855683800&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;OAuth&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Open-Xchange server can act as an OAuth client (starting with v6.20) or be an OAuth provider itself (starting with v7.8.0). The OAuth module supports both aspects:&lt;br /&gt;
&lt;br /&gt;
* Manage multiple OAuth accounts for certain online services for a user. The OAuth mechanism allows the Open-Xchange application to act as behalf of this user using previously obtained access tokens granted by user. The according interface is divided into two parts: Account access and service's meta data access.&lt;br /&gt;
* Manage granted accesses of external services that can access a users data on his behalf, called &amp;quot;grants&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== OAuth account access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service account access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth accounts ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The &amp;lt;b&amp;gt;optional&amp;lt;/b&amp;gt; service meta data identifier. If missing all accounts of all services are returned; otherwise all accounts of specified service are returned&lt;br /&gt;
&lt;br /&gt;
Response: An array with account data. Each array element is a JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
| serviceId     || String   || The identifier of the associated service meta data; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| secret || String || The token secret&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Delete an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Update an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier. May also be provided in request body's JSON OAuth account representation by &amp;lt;code&amp;gt;&amp;quot;id&amp;quot;&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the OAuth account fields to update. See [[#OauthAccountData | OAuth account data]]. Currently the only values which make sende being updated are &amp;lt;code&amp;gt;&amp;quot;displayName&amp;quot;&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;&amp;quot;token&amp;quot;&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;&amp;quot;secret&amp;quot;&amp;lt;/code&amp;gt;-pair.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Initialize creation of an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=init&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The service meta data identifier; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An JSON representation of the resulting interaction providing needed information to complete account creation. See [[#OauthInteractionData | OAuth interaction data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OauthInteractionData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth interaction&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| authUrl || String || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The interaction type name; &amp;lt;code&amp;gt;&amp;quot;outOfBand&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;callback&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| uuid || String || The UUID for this OAuth interaction&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Create an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
Note: This action is typically called by provided call-back URL and is ony intended for manual invocation if &amp;quot;outOfBand&amp;quot; interaction is returned by preceeding &amp;lt;code&amp;gt;/ajax/oauth/account?action=init&amp;lt;/code&amp;gt; step.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=create&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_token&amp;lt;/code&amp;gt; – The request token from preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; – The UUID of the preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_verfifier&amp;lt;/code&amp;gt; – The verifier string which confirms that user granted access&lt;br /&gt;
* &amp;lt;code&amp;gt;displayName&amp;lt;/code&amp;gt; – The display name for the new account&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing the newly created OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
=== OAuth service meta data access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service meta data access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth services' meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array with service data. Each array element is a JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth service's meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The service's identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthServiceMetaData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth service meta data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Manage OAuth grants (available with v7.8.0) ===&lt;br /&gt;
&lt;br /&gt;
==== Get all grants ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/grants?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing one object for every granted access as specified in [[#OAuthGrants | OAuth grants]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthGrants&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth grants&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| client || Object || A JSON object describing the external service as in [[#OAuthClient | OAuth client]].&lt;br /&gt;
|-&lt;br /&gt;
| scopes || Object || A JSON object with mappings from scope tokens to translated, human-readable descriptions for every scope that was granted to the external service. Example: {&amp;quot;read_contacts&amp;quot;:&amp;quot;See all your contacts.&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| date || Time || The time when the access was granted.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthClient&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth client&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The clients ID.&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The clients/services name.&lt;br /&gt;
|-&lt;br /&gt;
| description || String || A description of the client.&lt;br /&gt;
|-&lt;br /&gt;
| website || String || A URL to the clients website.&lt;br /&gt;
|-&lt;br /&gt;
| icon || String || A URL or path to obtain the clients icon via the &amp;quot;image&amp;quot; module.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Revoke access ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;oauth/grants?action=revoke&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - The ID of the client whose access shall be revoked.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;JSlob&amp;quot; (available with v6.22) ==&lt;br /&gt;
&lt;br /&gt;
The JSlob module is used to store&amp;amp;retrieve arbitrary JSON-structured configuration for a single user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all JSLobs ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jslob?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;JSlobData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | JSlob data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String or Number || The identifier of the JSlob.&lt;br /&gt;
|-&lt;br /&gt;
| jslob || JSON object || The JSON configuration.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== List denoted JSLobs ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array of JSlob identifiers; e.g. &amp;lt;code&amp;gt;[ &amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, … ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== Delete a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The JSlob identifier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An empty request body&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Store a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the &amp;quot;path&amp;quot; and &amp;quot;value&amp;quot; of the JSON configuration to store. If &amp;quot;path&amp;quot; is missing the current configuration&lt;br /&gt;
is merged with given JSON object.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Update a single value inside a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: The new value to store inside specified JSlob&lt;br /&gt;
&lt;br /&gt;
Response: A JSlob representation according to [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== REST-like access to JSlob module ===&lt;br /&gt;
&lt;br /&gt;
to be done...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;freebusy&amp;quot; (available with v6.22.1) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to free/busy information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get free/busy information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/freebusy?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;participant&amp;lt;/code&amp;gt; – The participant to get the free/busy data for. May be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Response: An array of free/busy intervals as described in [[#FreeBusyInterval | Free/Busy interval]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FreeBusyInterval&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Free/Busy interval&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| start_date  || Time       || Start time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| end_date    || Time       || End time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number     || The busy status of this interval, one of:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| id          || String     || Object ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id   || String     || Folder ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| title       || String     || Title of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| location    || String     || Location of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean    || True if the corresponding appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a list of free/busy information ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/freebusy?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of participants to get the free/busy data for. Each participant may be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
&lt;br /&gt;
Response: The free/busy data for all requested participants inside a JSON object with the participants as keys. Besides a combined data element for a requested group, all group members are resolved and listed seperately in the result. If the 'merged' view was requested, an additional data element named 'merged' representing a combined view for all requested participants is added to the results implicitly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Services ==&lt;br /&gt;
&lt;br /&gt;
Messaging Services represent a messaging backend. The messaging services add a new folder module &amp;quot;messaging&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
A *Messaging Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a messagingService. Usually a String in reverse domain name notation. Example: &amp;quot;com.openexchange.messaging.twitter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Twitter&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| formDescription || Array      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
| messagingActions || Array     || An array of Strings a dynamic set of actions that are possible with messages of this service. Described in detail later on. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of messaging service objects. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the messaging service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a messaging service object.&lt;br /&gt;
&lt;br /&gt;
== Messaging Accounts ==&lt;br /&gt;
&lt;br /&gt;
A messaging account represents the concrete configuration of an account of a given messaging service.&lt;br /&gt;
A *messaging account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number      || Identifies a given messaging account. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| messagingService || String  || The messaging service id of the messaging service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant messagingService &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;messagingService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* messagingService - (optional) list only those accounts that belong to the given messagingService.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Messages ==&lt;br /&gt;
&lt;br /&gt;
A Messaging Message represents a single message. It consists of some metadata, headers and a content. The content attribute varies by the content-type header. &lt;br /&gt;
If the content type is text/* it is a string, if it is a multipart/* it is an array of objects, each representing a part of the multipart. If it is anything else&lt;br /&gt;
it is considered binary and is a Base64 encoded string (ToDo : This is not smart enough yet. I suppose we'll have to include encoding options for binaries much like in our EAVJSONProposal).&lt;br /&gt;
&lt;br /&gt;
The folder id of a message follows a predefined format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[messagingService]://[accountId]/[path]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for an imaginary example consider: &amp;quot;com.openexchange.messaging.twitter://535/defaultTimeline/directMessages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The structure of a Messaging Message is as follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Message&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|id            ||String       || The id of this message. Only unique in the given folder. &lt;br /&gt;
|-&lt;br /&gt;
|folder        ||String       || The folder id. &lt;br /&gt;
|-&lt;br /&gt;
|threadLevel   ||Number       || The nesting level of this message according to the conversation it's belonged to. May not be set. &lt;br /&gt;
|-&lt;br /&gt;
|flags         ||Number       || Bitmask showing the state of this message. The same as in the module &amp;quot;mail&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|receivedDate  ||Time         || The time this message was received. &lt;br /&gt;
|-&lt;br /&gt;
|colorLabel    ||Number       || An arbitrary number marking this message in a certain color. The same as the colorLabel common to all groupware objects (see HTTP API)&lt;br /&gt;
|-&lt;br /&gt;
|user          ||Array        || An array of strings. Represents user flags. &lt;br /&gt;
|-&lt;br /&gt;
|size          ||Number       || The binary size of this message in bytes. &lt;br /&gt;
|-&lt;br /&gt;
|picture    || String       || A string depicting the URL to a picture for this message &lt;br /&gt;
|-&lt;br /&gt;
|url           || String      || A string that contains a link to the messages origin. Currently used in RSS messages.&lt;br /&gt;
|-&lt;br /&gt;
|headers       ||JSONObject   || A JSON Object of header data. Usually the value is either a String or an Array (if the headers has more than one value). Certain headers are rendered as more complex structures, see the section &amp;quot;Complex Headers&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|content       ||String or Array || See introductory note for Messaging Messages. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The structure of a Multipart Part (an element of the content array in a multipart/* message) is a s follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Multipart Element&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|sectionId     || String       || The sectionId of this part.&lt;br /&gt;
|-&lt;br /&gt;
|headers       || JSONObject   || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|content       || String or Array || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some *Complex Headers* have a structure differing from simple key/value(s) pairs. These are:&lt;br /&gt;
&lt;br /&gt;
=== Content-Type ===&lt;br /&gt;
&lt;br /&gt;
The Content-Type header is represented as a JSON Object with the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Content Type Header&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| type         || String          || The type string (eg. text/plain). This governs the rendering of the content of a message. &lt;br /&gt;
|-&lt;br /&gt;
| params       || Object          || An Object with the keys &amp;quot;charset&amp;quot;, containing the charset of this message and &amp;quot;name&amp;quot; pointing to the filename this part or message should have. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting the content-type header in a messaging messages generated on the client the header may also be sent in it's short form. The short form is the type followed by a semi-colon separated list of key=value pairs&lt;br /&gt;
of the params. For example: &amp;quot;text/plain;charset=utf-8;name=something.txt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Address Headers ===&lt;br /&gt;
&lt;br /&gt;
Address headers ( From, To,Cc,Bcc,Reply-To,Resent-Reply-To,Disposition-Notification-To,Resent-To,Sender,Resent-Sender,Resent-To,Resent-Cc,Resent-Bcc ) are formatted as an array of objects, or in case of &amp;quot;From&amp;quot; as a single object, with the attributes *address* and *personal*:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Address Headers&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| address         || String     || The technical part of the address&lt;br /&gt;
|-&lt;br /&gt;
| personal       || String      || A displayable description of the addressee. May be unset.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting an address header the header may also be sent by clients in the short form &amp;lt;code&amp;gt;&amp;quot;personal &amp;amp;lt;address&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;&amp;quot;Clark Kent &amp;amp;lt;clark.kent@dailyplanet.com&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== List renderings of Messaging Messages ===&lt;br /&gt;
&lt;br /&gt;
Actions returning lists of messages usually return only a selection of attributes of a message driven by a &amp;quot;columns&amp;quot; parameter. The columns that are addressable point either to attributes of the top-level message or its headers. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Header Equivalence&lt;br /&gt;
! Column     !! Refers To&lt;br /&gt;
|-&lt;br /&gt;
|   *column*    |     *refers to*     &lt;br /&gt;
|-&lt;br /&gt;
| id            || The id attribute    &lt;br /&gt;
|-&lt;br /&gt;
| folderId      || The folder attribute &lt;br /&gt;
|-&lt;br /&gt;
| contentType   || The &amp;quot;Content-Type&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| from          || The &amp;quot;From&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| to            || The &amp;quot;To&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| cc            || The &amp;quot;Cc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| bcc           || The &amp;quot;Bcc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| subject       || The &amp;quot;Subject&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| size          || The size attribute &lt;br /&gt;
|-&lt;br /&gt;
| sentDate      || The &amp;quot;Date&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| receivedDate  || The receivedDate attribute &lt;br /&gt;
|-&lt;br /&gt;
| flags         || The flags attribute &lt;br /&gt;
|-&lt;br /&gt;
| threadLevel   || The threadLevel attribute &lt;br /&gt;
|-&lt;br /&gt;
| dispositionNotificationTo || The &amp;quot;Disposition-Notification-To&amp;quot; header. &lt;br /&gt;
|-&lt;br /&gt;
| priority      || The &amp;quot;X-Priority&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| colorLabel    || The colorLabel attribute &lt;br /&gt;
|-&lt;br /&gt;
| url             || The url attribute &lt;br /&gt;
|-&lt;br /&gt;
| body          || The content attribute &lt;br /&gt;
|-&lt;br /&gt;
| headers       || The headers attribute &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== JSON calls ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* id - The ID of the message to load&lt;br /&gt;
* peek - (optional) if set to &amp;quot;true&amp;quot; the read/unread state of the message will not change. Defaults to false.&lt;br /&gt;
* folder - The folder id&lt;br /&gt;
   &lt;br /&gt;
Response: An Object representing the loaded message.&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/message?action=send&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* recipients - (optional) If set the message is sent to the given list of recipients, otherwise this defaults to the &amp;quot;To&amp;quot; header of the message.&lt;br /&gt;
   &lt;br /&gt;
Request Body: The Request Body should contain the JSON Object representing the message to be sent.&lt;br /&gt;
Response: &amp;quot;1&amp;quot; as the data of a regular response on success.&lt;br /&gt;
&lt;br /&gt;
GET or PUT /ajax/messaging/message?action=perform&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* action - The messaging action to invoke&lt;br /&gt;
* id - The id of the message the action should be invoked on. Only used on actions of type &amp;quot;storage&amp;quot;.&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
   &lt;br /&gt;
Request Body: On actions of type &amp;quot;message&amp;quot; the body should contain the JSON representation of the message the action should be applied to.&lt;br /&gt;
Response: Either 1 if no further user interaction is needed or a messaging message that, after having the user modify it has to be supplied back to the follower action of this action.&lt;br /&gt;
&lt;br /&gt;
Thus, to invoke a messaging action of type &amp;quot;storage&amp;quot; the folder and id are needed. Messaging actions of type &amp;quot;message&amp;quot; need a folder and message in the body. &lt;br /&gt;
Messaging actions of type &amp;quot;none&amp;quot; need a messaging message and account. &lt;br /&gt;
&lt;br /&gt;
==== List style requests ====&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
* sort - (optional) A column to sort by.&lt;br /&gt;
* order - (optional) The order direction. &amp;quot;asc&amp;quot; for ascending or &amp;quot;desc&amp;quot; for descending. Defaults to &amp;quot;asc&amp;quot;&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the the columns parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/messages?action=list&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
&lt;br /&gt;
Request Body: An array of arrays with the folder and id as elements each identifying a message. &lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Snippet module (available with v7.0.0/v6.22.0) ==&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=get&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The snippet's JSON representation; e.g.&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;signature&amp;quot;,&lt;br /&gt;
    &amp;quot;props&amp;quot;: {&amp;quot;x-custom&amp;quot;: &amp;quot;any value&amp;quot;},&lt;br /&gt;
    &amp;quot;module&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;displayname&amp;quot;: &amp;quot;My signature&amp;quot;,&lt;br /&gt;
    &amp;quot;misc&amp;quot;: {&amp;quot;foo&amp;quot;: &amp;quot;bar&amp;quot;},&lt;br /&gt;
    &amp;quot;createdby&amp;quot;: 17,&lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;-- \\nMy name and position here&amp;quot;,&lt;br /&gt;
    &amp;quot;accountid&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;shared&amp;quot;: false,&lt;br /&gt;
    &amp;quot;files&amp;quot;:&lt;br /&gt;
    [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;mimetype&amp;quot;: &amp;quot;image/png; name=pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;filename&amp;quot;: &amp;quot;pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;46f49f8a-40d5-4f29-8bc9-728f3420864c&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 6074&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Gets all snippets associated with the current user and context ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=all&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* type		- Optional CSV of types to filter by; e.g. &amp;quot;signature&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets certain snippets by identifiers ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=list&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of snippet identifiers&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet's attachment by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=getattachment&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
* attachmentid	- The attachment identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The attachment's raw data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Creates a new snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=new&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The created snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Updates a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=update&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet providing the fields that should be changed.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's JSON representation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Deletes a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=delete&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier (otherwise provide one or more identifiers through request body's JSON array)&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of identifiers denoting the snippets to delete&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
An empty/dummy result (don't care)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Attaches one or more files to an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
POST /ajax/snippet?action=attach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
Multipart form data providing the upload files to attach to the snippet.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Detaches open or more files from an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=detach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array providing the identifiers of the attachments to remove from snippet&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
== Module Halo ==&lt;br /&gt;
&lt;br /&gt;
=== Investigate contact ===&lt;br /&gt;
&lt;br /&gt;
PUT /appsuite/api/halo/contact?action=investigate&lt;br /&gt;
&lt;br /&gt;
The investigate action provides access to different halo providers. &lt;br /&gt;
Each provider requires an own set of parameters and also provides different results. &lt;br /&gt;
The following section describes some but not necessarily all of this providers.&lt;br /&gt;
Each request contains the following common parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; - The provider to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; - (optional) The timezone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to this parameters a contact must be defined. This can be done either with at least one of the following parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or within the request body.&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
&lt;br /&gt;
Instead of the contact parameters one can send a JSON object within the body of the request. This body describes the contact.&lt;br /&gt;
If used, it must contain at least one of the fields shown below. If the requests contains a body, the contact specific parameters are ignored. &lt;br /&gt;
It is also possible to provide more contact information. Empty fields are filled up with this values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSON object:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
	&amp;quot;contact_id&amp;quot;:12345&lt;br /&gt;
	&amp;quot;internal_userid&amp;quot;:12345&lt;br /&gt;
	&amp;quot;email1&amp;quot;: mail1@domain.com&lt;br /&gt;
	&amp;quot;email2&amp;quot;: mail2@domain2.com&lt;br /&gt;
	&amp;quot;email3&amp;quot;: mail3@domain3.com&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
The request responds with a JSON object. The content and structure of this object depends on the chosen provider. &lt;br /&gt;
In each case the response contains only data known to the server. Therefore some or all fields may be null.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.contacts &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
&lt;br /&gt;
A JSON array with the contact informations specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.appointments &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Requests parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - The start point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; - The end point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
	&lt;br /&gt;
A JSON array of appointments. Each appointment contains the fields specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.mail &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - The maximum number of mails within the result.&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
	&lt;br /&gt;
A JSON array of mails. Each mail contains the fields specified by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get halo services ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact?action=services&lt;br /&gt;
&lt;br /&gt;
Request parameter: &lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
 &lt;br /&gt;
A JSON object with a &amp;quot;data&amp;quot; field which contains an array of all available halo providers.&lt;br /&gt;
&lt;br /&gt;
=== Get contact picture ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact/picture&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - (optional) falls back to the public session cookie&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt; - (optional)  The internal user id of a user whose picture you want to load&lt;br /&gt;
* &amp;lt;code&amp;gt;userid&amp;lt;/code&amp;gt; - (optional) an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;user_id&amp;lt;/code&amp;gt; - (optional)  an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - (optional) a contact id&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; - (optional) an email to search for. Will pick global address book matches before regular matches. After that picks the most recently changed contact&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt; - (optional)  an alias for email&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt; - (optional) another email address to use to find matches&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt; - (optional) and yet another email address to use to find matches&lt;br /&gt;
&lt;br /&gt;
''At least one of the optional search parameters should be set. All parameters are connected by OR during the search. More specific parameters like user_id or id are prioritized in case of multiple matches.''&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The picture with proper eTag and caching headers set, or an HTTP Status 404 response, if no picture could be found.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;capabilities&amp;quot; (available with v7.4.2) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to capabilities, i.e. modules or features that are available on the backend and the user has access to.&lt;br /&gt;
&lt;br /&gt;
=== Get a capability ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the capability&lt;br /&gt;
&lt;br /&gt;
Response: The requested capability as described in [[#Capability| Capability]], if available, otherwise an empty result&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capability&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capability&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id  || String       || The identifier of the capability&lt;br /&gt;
|-&lt;br /&gt;
| attributes    || Object       || A JSON object holding optional properties of the capability &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all capabilities ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of capability objects as described in [[#Capability| Capability]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;jump&amp;quot; (available with v7.6.0) ==&lt;br /&gt;
&lt;br /&gt;
The jump module is used to pass an acquired identity token for an authenticated user from one system to another for a single sign-on.&lt;br /&gt;
&lt;br /&gt;
=== Acquire an identity token ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jump?action=identityToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; – The identifier for the external service/system&lt;br /&gt;
&lt;br /&gt;
Response: The acquired identity token wrapped by a simple JSON object as described in [[#Jump| Jump]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Jump&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Jump&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| token  || String       || The identifier of the token&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;find&amp;quot; (preliminary, available with v7.6.1) ==&lt;br /&gt;
The Find API consists of calls for performing searches within the modules mail, contacts, calendar, tasks and drive. It was designed to provide an iterative approach where the search criteria can be refined step-wise until the desired items are found. The starting point is always an &amp;quot;autocomplete&amp;quot; request, that suggests possible search filters based on a users input. Those filters are grouped into categories, called &amp;quot;facets&amp;quot;. A facet may provide one or more &amp;quot;values&amp;quot; with every value being a possible filter. A client is meant to remember every value that was selected by a user and include it within the following &amp;quot;autocomplete&amp;quot; and &amp;quot;query&amp;quot; requests, while &amp;quot;query&amp;quot; performs the actual search and returns the found items.&lt;br /&gt;
&lt;br /&gt;
Every request is bound to a module that must be specified via the URL-Parameter &amp;quot;module&amp;quot;. Possible modules are&lt;br /&gt;
* mail&lt;br /&gt;
* contacts&lt;br /&gt;
* calendar&lt;br /&gt;
* tasks&lt;br /&gt;
* drive&lt;br /&gt;
&lt;br /&gt;
=== General assumptions ===&lt;br /&gt;
Some of the objects returned by the server contain former user input. A client must never interpret  strings as HTML but always as plain text to be not vulnerable for CSS attacks!&lt;br /&gt;
&lt;br /&gt;
=== Calls ===&lt;br /&gt;
The find API provides two dedicated calls under the servlet path &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* action=query&lt;br /&gt;
&lt;br /&gt;
=== Facets ===&lt;br /&gt;
The style of a facet is responsible for how the according object is structured, how it is handled on the server-side and how the client has to handle it.&lt;br /&gt;
We distinguish three styles of facets:&lt;br /&gt;
* simple&lt;br /&gt;
* default&lt;br /&gt;
* exclusive&lt;br /&gt;
&lt;br /&gt;
Every facet value contains an embedded &amp;quot;filter&amp;quot; object. The filter must not be changed by the client, it has to be seen as a black-box. Instead the filters&lt;br /&gt;
of selected facet values have to be copied and sent to the server with the subsequent requests.&lt;br /&gt;
&lt;br /&gt;
==== Simple Facets ====&lt;br /&gt;
A simple facet is a special facet that has exactly one value. The facets&lt;br /&gt;
type and its value are strictly coupled, in a way that a display name for both,&lt;br /&gt;
facet and value would be redundant. A simple facet generally denotes a logical field like&lt;br /&gt;
'phone number'. Internally this logical field can map to several internal fields&lt;br /&gt;
(e.g. 'phone_private', 'phone_mobile', 'phone_business'). In clients the facet as&lt;br /&gt;
a whole can be displayed as a single item. Example: &amp;quot;Search for 'term' in field 'phone&lt;br /&gt;
number'&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;simple&amp;quot; || Denotes that this is a facet of style simple&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
    &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Default Facets ====&lt;br /&gt;
A default facet contains multiple values and may be present&lt;br /&gt;
multiple times in search requests to filter results by a combination of different&lt;br /&gt;
values (e.g. &amp;quot;mails with 'foo' and 'bar' in subject&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;default&amp;quot; || Denotes that this is a facet of style default&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| values || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
    &amp;quot;values&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
        &amp;quot;item&amp;quot;:{&lt;br /&gt;
          &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
          &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exclusive Facets ====&lt;br /&gt;
An exclusive facet is a facet where the contained values are&lt;br /&gt;
mutually exclusive. That means that the facet must only be present once&lt;br /&gt;
in an autocomplete or query request.&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;exclusive&amp;quot; || Denotes that this is a facet of style exclusive&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| options || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
    &amp;quot;options&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Active Facets ====&lt;br /&gt;
Every value that has been selected by a user must be remembered and provided with every subsequent request. The representation of a facet within a request body differs from the one within an autocomplete response. We call those &amp;quot;active facets&amp;quot;. Their representation is independent from their style.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Active Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Active Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| facet || &amp;lt;string&amp;gt; || The id of the according facet.&lt;br /&gt;
|-&lt;br /&gt;
| value || &amp;lt;string&amp;gt; || The id of the according value. Must always be copied from the value object, not from a possibly according option (in the two-dimensional case).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter object, copied from the value or option.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
According to the users configuration, some restrictions may apply that have to be heeded by clients. Those restrictions can be retrieved via the &amp;quot;config&amp;quot; or the &amp;quot;jslob&amp;quot; modules. The following restrictions may apply:&lt;br /&gt;
&lt;br /&gt;
* A user might have limited access to modules and therefore the Find API may only serve requests for a subset of all possible modules. The configuration object may contain an object with key &amp;quot;modules&amp;quot;. Its value is an array containing all module identifiers that the user is allowed to use. If the user is not allowed to search in any module, the value will be null.&lt;br /&gt;
&lt;br /&gt;
* Some facets can be mandatory, i.e. they must be pre-defined by the client and provided with every request. Whether a facet is mandatory or not is decided on a per-module basis. The configuration object may contain an object with key &amp;quot;mandatory&amp;quot;. Every facet that may be mandatory is specified via its id in that object (e.g. mandatory.folder). The value of such a key is either an array containing all module identifiers, where the facet is mandatory or null, if it is not manadatory in any module.&lt;br /&gt;
  &lt;br /&gt;
* Due to performance reasons the service provider can enforce a minimium number of characters that have to be provided before an autocomplete request may be issued. That property is called &amp;quot;minimumQueryLength&amp;quot; and its value is an integer that specifies the minimum number of characters. If a client does not heed this property, the server will respond with an error if the provided user input is too short.&lt;br /&gt;
&lt;br /&gt;
==== Config Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/config/search?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
            &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                &amp;quot;mail&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;modules&amp;quot;: [&lt;br /&gt;
            &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;contacts&amp;quot;,&lt;br /&gt;
            &amp;quot;calendar&amp;quot;,&lt;br /&gt;
            &amp;quot;tasks&amp;quot;,&lt;br /&gt;
            &amp;quot;drive&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GET http://localhost/appsuite/api/config/minimumSearchCharacters?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSLob Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/jslob?action=get&amp;amp;id=io.ox/core&amp;amp;session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;io.ox/core&amp;quot;,&lt;br /&gt;
        &amp;quot;tree&amp;quot;: {&lt;br /&gt;
            &amp;quot;search&amp;quot;: {&lt;br /&gt;
                &amp;quot;modules&amp;quot;: [&lt;br /&gt;
                    &amp;quot;mail&amp;quot;,&lt;br /&gt;
                    &amp;quot;contacts&amp;quot;,&lt;br /&gt;
                    &amp;quot;calendar&amp;quot;,&lt;br /&gt;
                    &amp;quot;tasks&amp;quot;,&lt;br /&gt;
                    &amp;quot;drive&amp;quot;&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
                    &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                        &amp;quot;mail&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;minimumQueryLength&amp;quot;: 0&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocomplete ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* limit=&amp;lt;int&amp;gt; - The maximum number of values returned per facet&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the users input (specified as &amp;quot;prefix&amp;quot;), already selected facets and possible options.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=autocomplete&amp;amp;module=mail&amp;amp;limit=3&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;prefix&amp;quot;:&amp;quot;test&amp;quot;,  &lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;facets&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },      &lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
        &amp;quot;values&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
            &amp;quot;item&amp;quot;:{&lt;br /&gt;
              &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
              &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;options&amp;quot;:[&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== query ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=query&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* columns=&amp;lt;column-ids&amp;gt; - A comma-separated list of the module-specific columns that shall be contained in the response items.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the selected facets and possible options. For pagination the keys &amp;quot;start&amp;quot; and &amp;quot;size&amp;quot; can be set.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=query&amp;amp;module=mail&amp;amp;columns=102,600,601,602,603,604,605,607,608,610,611,614,652&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:null&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;subject&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:1409579708116,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:{&lt;br /&gt;
        &amp;quot;fields&amp;quot;:[&lt;br /&gt;
          &amp;quot;subject&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;queries&amp;quot;:[&lt;br /&gt;
          &amp;quot;lorem&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start&amp;quot;:0,&lt;br /&gt;
  &amp;quot;size&amp;quot;:101&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;num_found&amp;quot;:-1,&lt;br /&gt;
    &amp;quot;start&amp;quot;:0,&lt;br /&gt;
    &amp;quot;size&amp;quot;:1,&lt;br /&gt;
    &amp;quot;results&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;110458&amp;quot;,&lt;br /&gt;
        &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
        &amp;quot;attachment&amp;quot;:false,&lt;br /&gt;
        &amp;quot;from&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;John Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;john.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;to&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;jane.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cc&amp;quot;:[&lt;br /&gt;
&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;subject&amp;quot;:&amp;quot;Lorem Ipsum&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;:7501,&lt;br /&gt;
        &amp;quot;received_date&amp;quot;:1408531387000,&lt;br /&gt;
        &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
        &amp;quot;priority&amp;quot;:3,&lt;br /&gt;
        &amp;quot;account_name&amp;quot;:&amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
        &amp;quot;account_id&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Available Options ===&lt;br /&gt;
Every request body may contain an &amp;quot;options&amp;quot; object to finetune some specific behavior. Currently possible options are:&lt;br /&gt;
* timezone: &amp;lt;tz-name&amp;gt; - The timezone to use if any dates are returned.&lt;br /&gt;
* admin: &amp;lt;boolean&amp;gt; - true to include the context admin if it matches any search criteria. If the context admin shall always be ignored (i.e. not returned), false has to be set.&lt;br /&gt;
&lt;br /&gt;
=== Possible Flags ===&lt;br /&gt;
Every facet may carry one or more flags that describe further aspects of that facet. Currently possible flags are:&lt;br /&gt;
* conflicts - Specified in the form of &amp;quot;conflicts:&amp;lt;other-id&amp;gt;&amp;quot;. A facet carrying this flag must not be combined with a facet of type &amp;lt;other-id&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;share/management&amp;quot; (preliminary, available with v7.8.0) ==&lt;br /&gt;
&lt;br /&gt;
Share links and can be created and managed via different actions in the &amp;quot;share/management&amp;quot; module. Additionally, there are dedicated actions to list all shares of a user in the modules [[#Get_shared_folders_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;folders&amp;quot;]] and [[#Get_shared_infoitems_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;files&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== Get a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Basic information about an already existing or newly created share link as described in [[#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Target&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| module || String || The folder's module name, i.e. one of &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| folder || String || The folder identifier &lt;br /&gt;
|-&lt;br /&gt;
| item   || String || (Optional) The object identifier, in case the share targets a single item &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareLink&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Link&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| url   || String  || The link to the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| entity   || Number  || The identifier of the anonymous user entity for the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| is_new   || Boolean  || Whether the share link is new, i.e. it has been created by the &amp;lt;tt&amp;gt;getLink&amp;lt;/tt&amp;gt;-request, or if it already existed  (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Time   ||  (Optional) The end date / expiration time after which the share link is no longer accessible.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || (Optional) An additional secret / pin number an anonymous user needs to enter when accessing the share&lt;br /&gt;
|-&lt;br /&gt;
| meta || JSON || (Optional) Arbitrary JSON data saved along with the share as specified by client &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Update a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The last modified timestamp of the link to be updated. Used to detect concurrent modifications.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in [[#ShareLink|Share Link]] containing the properties of the link to update., as well as the share target itself as described in [[#ShareTarget|Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Delete a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be deleted for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Send a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional message can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;drive&amp;quot; ==&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side. &lt;br /&gt;
&lt;br /&gt;
A detailed description can be found in a sepearet article: [[OX_Drive_API|OX Drive API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;passwordchange&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Users can change their password via the &amp;quot;passwordchange&amp;quot; module. &lt;br /&gt;
&lt;br /&gt;
=== Update password ===&lt;br /&gt;
&lt;br /&gt;
Note: The new password will be set without any checks. The client must ensure that it is the password the user wants to set. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/passwordchange?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in PasswordChange.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PasswordChange&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Password change&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| old_password || String || The users' current password or 'null' if the password wasn't set before (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
| new_password || String || The new password the user wants to set or 'null' to remove the password (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File Storage Services ==&lt;br /&gt;
&lt;br /&gt;
File storage services represents a file storage backend; e.g. Drive, Dropbox, etc.&lt;br /&gt;
&lt;br /&gt;
A *File Storage Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a file storage service. Example: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Box File Storage Service&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| configuration || JSON object      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileservice?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of file storage service objects. &lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileservice?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the file storage service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a file storage service object.&lt;br /&gt;
&lt;br /&gt;
== File Storage Accounts ==&lt;br /&gt;
&lt;br /&gt;
A file storage account represents the concrete configuration of an account of a given file storage service.&lt;br /&gt;
A *file storage account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageAccount&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || String      || Identifies a given file storage account in the scope of its file storage service (Infostore, Dropbox.com, Google OneDrive etc.). This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| filestorageService || String  || The identifier of the file storage service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| qualifiedId || String || Identifies a given file storage account globally, i.e. accross all file storage services. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| rootFolder || String || ID of the accounts root folder within the folder tree. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| isDefaultAccount || Boolean || Whether this account is the users default account. Exactly one account will have this flag set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant file storage service &lt;br /&gt;
|-&lt;br /&gt;
| capabilities || List of Strings || A list of capability names. Possible values are: &amp;quot;FILE_VERSIONS&amp;quot;, &amp;quot;EXTENDED_METADATA&amp;quot;, &amp;quot;RANDOM_FILE_ACCESS&amp;quot;, &amp;quot;LOCKS&amp;quot; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are&lt;br /&gt;
&lt;br /&gt;
=== Create a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;filestorageService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delete a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileaccount?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* filestorageService - (optional) list only those accounts that belong to the given file storage service.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example for creating a new OAuth-based file storage account ===&lt;br /&gt;
&lt;br /&gt;
First, get the description of the file storage service for which a new account is supposed to be created:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/fileservice?action=get&amp;amp;id=boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   {&lt;br /&gt;
    id: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
    displayName: &amp;quot;Box File Storage Service&amp;quot;&lt;br /&gt;
    configuration: {&lt;br /&gt;
      widget: &amp;quot;oauthAccount&amp;quot;&lt;br /&gt;
      options: {&lt;br /&gt;
        type: &amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      name: &amp;quot;account&amp;quot;&lt;br /&gt;
      displayName: &amp;quot;Select an existing account&amp;quot;&lt;br /&gt;
      mandatory: true&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next get the associated OAuth account information:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/oauth/accounts?action=all&amp;amp;serviceId=com.openexchange.oauth.boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;data&amp;quot;:[{&amp;quot;id&amp;quot;:333,&amp;quot;displayName&amp;quot;:&amp;quot;My Box.com account&amp;quot;,&amp;quot;serviceId&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;}]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create the file storage account:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  PUT /ajax/fileaccount?action=new&amp;amp;session=...&lt;br /&gt;
  &lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;filestorageService&amp;quot;:&amp;quot;boxcom&amp;quot;,&lt;br /&gt;
    &amp;quot;displayName&amp;quot;:&amp;quot;My box.com account&amp;quot;,&lt;br /&gt;
    &amp;quot;configuration&amp;quot;:{&lt;br /&gt;
      &amp;quot;account&amp;quot;:&amp;quot;333&amp;quot;,&lt;br /&gt;
      &amp;quot;type&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response provides the relative (in context of the according file storage service) identifier of the newly created account:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;data&amp;quot;:19}&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21477</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21477"/>
		<updated>2016-02-12T14:59:49Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#File_Metadata]]. If available, the requested metadata of files is included in the corresponsing &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|-&lt;br /&gt;
| capabilities || Array || A JSON array holding relevant capabilities of the user. Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;capabilities&amp;quot; : [&lt;br /&gt;
           &amp;quot;invite_guests&amp;quot;,&lt;br /&gt;
           &amp;quot;share_links&amp;quot;,&lt;br /&gt;
           &amp;quot;invite_users_and_groups&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.5353 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#File_Metadata|FileMetadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot;: 1418024049629,&lt;br /&gt;
   &amp;quot;modified&amp;quot;: 1418024189166,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this folder.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this folder.&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode&amp;diff=21476</id>
		<title>AppSuite:Sharing and Guest Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode&amp;diff=21476"/>
		<updated>2016-02-12T14:08:12Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Sharing and Guest Mode&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Starting with v7.8.0, the Open-Xchange server comes with a whole new concept to share contents with external people, allowing guest users to interact with the shared data in the same way as regular groupware users do. This article describes the underlying technical implications and outlines the different use cases.&lt;br /&gt;
&lt;br /&gt;
The main idea behind the new sharing concept is that guest users, i.e. external users without a regular account on the server, should be able to access the shared contents using the existing interfaces, especially the App Suite web interface. On the one hand, this includes consuming the shared data using the App Suite's advanced media viewing capabilities. On the other hand, this enables guests to edit existing as well as to create or upload new content in the groupware. Even real-time collaboration between internal users and guests in OX Documents is possible.&lt;br /&gt;
&lt;br /&gt;
The following chapters cover different topics regarding sharing and guest users and try to describe some technical background and impact where hosters, administrators or integrators might be interested in.&lt;br /&gt;
&lt;br /&gt;
== Creating Shares ==&lt;br /&gt;
&lt;br /&gt;
Basically, creating a share means adding an additional permission entity to the shared folder or item. Previously, this was only possible for &amp;amp;quot;internal&amp;amp;quot; entities, i.e. regular users or user groups. Now, the underlying permission system has been extended to support external entities, which can be either invited guest users, or special &amp;amp;quot;anonymous&amp;amp;quot; guest users who access a shared folder or item via a secret link. Anonymous and invited guest users are explained in more detail below.&lt;br /&gt;
&lt;br /&gt;
Sharing is available for the groupware modules Calendar, Contacts, Tasks and Drive (a.k.a. Infostore/Files). While the latter one also allows &amp;quot;writable&amp;quot; access for invited guest users, folders from the Calendar, Contacts and Tasks module may only be published in &amp;quot;read-only&amp;quot; mode to external guests.&lt;br /&gt;
&lt;br /&gt;
=== Invite Guests ===&lt;br /&gt;
&lt;br /&gt;
To share something to a guest user, it's possible to just add the e-mail address of the invitee as new permission entity for files and folders. The middleware then takes care to provision a new or reuse an existing account for the guest user, and equips him with the required permissions for accessing the contents. So, from a client's point of view, sharing something to a guest user is mostly the same process as sharing something to an internal user or group.&lt;br /&gt;
&lt;br /&gt;
=== Share Links ===&lt;br /&gt;
&lt;br /&gt;
Besides explicitly inviting a guest user to a share, it's also possible to just get a secret link for a folder or item. This will result in an additional &amp;amp;quot;anonymous&amp;amp;quot; guest entity in the permissions of the shared object, and will grant any user with the corresponding share link access the shared contents. To simplify the creation of share links, the clients will offer an additional &amp;amp;quot;wizard&amp;amp;quot; to quickly get a share link for a folder or item. Unlike invited guests which behave much like internal users, anonymous guest entities are strictly bound to the underlying folder or item, i.e. there is at most one anonymous permission entity per file or folder, as well as an anonymous permission entity can only be used for only once.&lt;br /&gt;
&lt;br /&gt;
=== Required Permissions and Capabilities ===&lt;br /&gt;
&lt;br /&gt;
Whether a user is allowed to create share links, invite external guests, or internal groups or users, depends on the following module access permissions and capabilities. Please note that share links no longer require &amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt; since Open-Xchange v7.8.1; this restriction was removed in order to allow simple publications also for non-groupware accounts, e.g. as defined by the &amp;lt;code&amp;gt;pim&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;pim_infostore&amp;lt;/code&amp;gt; module access combinations.&lt;br /&gt;
&lt;br /&gt;
* Create, update &amp;amp; remove share links ''(in v7.8.0)'': &amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt;&lt;br /&gt;
* Create, update &amp;amp; remove share links ''(in v7.8.1 and above)'': &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove internal users and group permissions: &amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove external guest permissions: &amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Existing shares for a guest user or context may be listed using the commandline utility &amp;lt;code&amp;gt;listshares&amp;lt;/code&amp;gt;&lt;br /&gt;
* The ability to create share links may be controlled via &amp;lt;code&amp;gt;com.openexchange.capability.share_links&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;permissions.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The ability to invite guest users may be controlled via &amp;lt;code&amp;gt;com.openexchange.capability.invite_guests&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;permissions.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The number of allowed share links per user may be specified via &amp;lt;code&amp;gt;com.openexchange.quota.share_links&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The number of allowed guest invitations per user may be specified via &amp;lt;code&amp;gt;com.openexchange.quota.invite_guests&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
&lt;br /&gt;
== Removing Shares ==&lt;br /&gt;
&lt;br /&gt;
The lifetime of shares is implicitly bound to the lifetime of the associated permission of the guest user entity. So, once a permission entity pointing to a (named or anonymous) guest user account is removed from the parent folder or item, this also leads to the removal of the associated share itself. Afterwards, the contents are no longer accessible for the guest user. For shares that were created with a specific expiry date, it is ensured that they can no longer be accessed via their share link after expiring. Additionally, expired shares are cleaned up periodically within a background task.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Shares may be revoked manually using the commandline utility &amp;lt;code&amp;gt;removeshares&amp;lt;/code&amp;gt;&lt;br /&gt;
* The interval of the periodic cleanup task can be controlled via &amp;lt;code&amp;gt;com.openexchange.share.cleanup.periodicCleanerInterval&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Share Links &amp;amp;amp; Tokens ==&lt;br /&gt;
&lt;br /&gt;
Shares are accessed with a hyperlink that contains the so-called share &amp;amp;quot;token&amp;amp;quot;. This 24-byte token uniquely identifies the associated guest account on the system, and carries enough randomness that it can't be guessed. Explicitly invited guest users receive this hyperlink in the invitation mail to a share, while in case of an &amp;amp;quot;anonymous&amp;amp;quot; share where just the link itself was generated, it's up to the sharing user to distribute the link on his own. Besides the token, a share link may contain an additional path that points to the concrete folder and item, which just aids to jump to the shared item in the web interface directly. The following shows an example of a share link:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://share.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/1/2/ODAxMDY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a guest user has been invited to more than one share in a context (based on his e-mail address), his individual share token remains equal, so that he will have access to all shared contents in the web interface after following any of the share links he received. However, the additional &amp;amp;quot;path&amp;amp;quot; still points to the concrete item. When inviting more than one guest user to the same share, each recipient will get his own individual share link.&lt;br /&gt;
&lt;br /&gt;
Once the share URL is requested from the server, the associated guest account is looked up and, depending of the guest type, the request is redirected to a specific login screen or directly into the App Suite web interface. More details regarding the different login modes are described at [[#Guest_Login_&amp;amp;_Session_Handling|Guest Login &amp;amp;amp; Session Handling]].&lt;br /&gt;
&lt;br /&gt;
After a share has been revoked (either explicitly, by removing the permission, or if the share is expired), share links can't be accessed any longer, and, after the last share for the guest user was removed, the guest account is removed from the system automatically.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The share token is stored as user attribute &amp;lt;code&amp;gt;com.openexchange.shareBaseToken&amp;lt;/code&amp;gt; in the corresponding guest user account&lt;br /&gt;
* The target database schema for a share and the associated guest account is extracted from the context identifier encoded in the share token&lt;br /&gt;
&lt;br /&gt;
== Guest Users ==&lt;br /&gt;
&lt;br /&gt;
As outlined above, guest users are created on demand once something is being shared. We basically distinguish between two types of guest users: Those that were invited explicitly by the sharing user, or &amp;amp;quot;anonymous&amp;amp;quot; guest users that are able to access by visiting the share link. Access for the latter one may optionally be secured with a fixed PIN code.&lt;br /&gt;
&lt;br /&gt;
For both kinds of guest users, a corresponding user account is provisioned dynamically on the system once a new share is created. Such a guest account is handled much similar as an account for a regular user, with the following main exceptions:&lt;br /&gt;
&lt;br /&gt;
* No access to the &amp;amp;quot;Mail&amp;amp;quot; module&lt;br /&gt;
* No personal folders&lt;br /&gt;
* No access to the &amp;amp;quot;Portal&amp;amp;quot;&lt;br /&gt;
* No access to the global address book&lt;br /&gt;
* Module access is restricted to only include modules from the actual shares&lt;br /&gt;
&lt;br /&gt;
All those restrictions are configured and enforced using the built-in mechanisms of the Open-Xchange Server, i.e. by a reduced set of capabilities (i.e. module permissions), or by selectively set permission bits in the folder tree for the virtual guest group. This ensures that guest users are only able to access things they explicitly have been invited to, as well as a transparent handling of guest accounts within all subsystems.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Guest users are stored much similar as regular users in the database (tables &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prg_contacts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_attribute&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_configuration&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Additionally, the identifier of the user who (initially) created the guest account is stored in &amp;lt;code&amp;gt;user.guestCreatedBy&amp;lt;/code&amp;gt;, i.e. if this column is not &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, this entry refers to a guest user&lt;br /&gt;
* All service calls and APIs that list or search users have been adjusted to be &amp;amp;quot;guest-aware&amp;amp;quot;, i.e. by default, guests users are not included in the output, yet may be included explicitly with additional parameters (namely &amp;lt;code&amp;gt;includeGuests&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;excludeUsers&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Service calls and APIs that request data explicitly based on an entity's identifier are also working with guest users, i.e. if a specific idnetifier points to a guest, then the referenced guest data is returned&lt;br /&gt;
&lt;br /&gt;
=== Capabilities ===&lt;br /&gt;
&lt;br /&gt;
Guest users always have the &amp;lt;code&amp;gt;guest&amp;lt;/code&amp;gt; capability set. Besides they are generally configured with a limited permission set, that allows them just to work with their shared items. This permission set includes:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Permission&lt;br /&gt;
!Capability&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;deniedportal&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|No &amp;lt;code&amp;gt;portal&amp;lt;/code&amp;gt; capability&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;editpublicfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;edit_public_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;editpassword&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;edit_password&amp;lt;/code&amp;gt;&lt;br /&gt;
|Only for invited guests, not links&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Additionally, for every module the guest is having shared items in, the according module permission is granted, e.g. a shared drive folder results in permission &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt; and the according capability. Guest users are never allowed to share folders or items on their own, i.e. the capabilities &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt; can never be set.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
This limited capability set can be extended by configuration. Currently three modes are supported:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Mode&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|deny_all&lt;br /&gt;
|No further capabilities are applied to guest users, except ones that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|static&lt;br /&gt;
|A static list of capabilities is applied to guest users via the &amp;lt;code&amp;gt;com.openexchange.share.staticGuestCapabilities&amp;lt;/code&amp;gt; property. Additionally capabilities that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt; are applied.&lt;br /&gt;
|-&lt;br /&gt;
|inherit&lt;br /&gt;
|All capabilities of the user who &amp;amp;quot;created&amp;amp;quot; the guest, i.e. created the link or initially invited somebody, are applied to the guest user. Additionally capabilities that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt; are applied.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The mode can be configured via the &amp;lt;code&amp;gt;com.openexchange.share.guestCapabilityMode&amp;lt;/code&amp;gt; property in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;. This property is config-cascade capable, so it can for example be overridden for certain sets of contexts. The same applies to the &amp;lt;code&amp;gt;com.openexchange.share.staticGuestCapabilities&amp;lt;/code&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
Due to this configuration mechanism it is possible to increase the user experience for guests and even allow some real collaboration. As an example one could apply the following configuration to allow guests to see preview images of files and edit shared documents with OX Text and OX Spreadsheet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;com.openexchange.share.guestCapabilityMode = static&lt;br /&gt;
com.openexchange.share.staticGuestCapabilities = document_preview, text, spreadsheet&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anonymous Guest Users ===&lt;br /&gt;
&lt;br /&gt;
If a &amp;amp;quot;share link&amp;amp;quot; is created, this results in an implicit creation of an anonymous guest user account on the server. The &amp;amp;quot;secret&amp;amp;quot; to access the shared contents is the share token itself that is encoded in the generated share link, so that everybody that knows the share link is able to access the shared contents. Optionally, such an anonymous share link may be secured with an additional PIN code. Guest users will be prompted to enter this PIN code when attempting to access the share.&lt;br /&gt;
&lt;br /&gt;
To have a strict separation between different shared contents, each time a folder or item is shared using the &amp;amp;quot;Get a link&amp;amp;quot; method, a designated anonymous guest account for this share is used. Consequently, each time such an anonymous share is revoked, this guest account is terminated again with no further delay. Additionally, such an anonymous guest entity can only be applied to the permission set of the folder or item the original link was created for, i.e. it's not possible to add more shared contents to an anonymous guest - in contrast to an invited, named guest user.&lt;br /&gt;
&lt;br /&gt;
Besides the common restrictions for guest accounts outlined above, the following applies for anonymous guest user accounts:&lt;br /&gt;
&lt;br /&gt;
* No e-mail address or display name&lt;br /&gt;
* No password, if no PIN was assigned by the sharing user&lt;br /&gt;
* A password that may only be changed by editing the link, if a PIN code was set&lt;br /&gt;
* Anonymous guest users may only receive &amp;amp;quot;read-only&amp;amp;quot; access permissions to the shared item&lt;br /&gt;
* Optionally, an expiry date can be applied for an anonymous guest user after which the share link is no longer accessible&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The PIN code for anonymous guest users is stored using symmetrical encryption in the database, therefore, an encryption key needs to be specified via the property &amp;lt;code&amp;gt;com.openexchange.share.cryptKey&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Named Guest Users ===&lt;br /&gt;
&lt;br /&gt;
Internal users are able to invite a guest user to a folder or item explicitly by specifying the e-mail address of the recipient. Such &amp;amp;quot;named&amp;amp;quot; guest users are internally stored as individual guest users, identified by their e-mail address.&lt;br /&gt;
&lt;br /&gt;
If data is shared for the first time to the recipient in the context, a new guest user account is provisioned and an initial set of user permissions and capabilities is assigned. In case there are already shares in different contexts to the same recipient (based on his e-mail address), some existing user data like a display name or an assigned password is copied over if a cross-context database is available on the system.&lt;br /&gt;
&lt;br /&gt;
If the recipient has already been invited from the same or another internal user in the context to another share before, the new share is added to the guest user in a way that the underlying folder- and object permissions are taken over, and the user capabilities getting expanded as needed to cover all modules the shares are located in. Similarly, if a share to a named guest user is revoked and the underlying folder- and object-permissions are removed, the guest user capabilities are updated implicitly to reflect the modules of the remaining shares.&lt;br /&gt;
&lt;br /&gt;
After the last share to a named guest user has been revoked, the user has no longer access to any data. The account itself gets removed from the context automatically after a configurable expiry time. Additionally, any data that is stored for the guest user in the cross-context database is removed once the guest user has been deleted from all contexts in the system.&lt;br /&gt;
&lt;br /&gt;
In contrast to an &amp;amp;quot;anonymous&amp;amp;quot; guest user, a named guest user has access to all shared items from a context after logging in, since the permissions get added to an existing guest user account automatically. For entering the web interface, he may use any of the share links that were sent to him in the different notification messages. Those links usually point to an individual share target like a folder or file, but the guest user may navigate to the other shared contents using the folder tree of the web interface in the same way as regular groupware users do. Similarly, if the guest user has access to shares from different modules, the modules can be switched in the web interface as usual.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The timespan after which an unused named guest user should be removed from the system can be configured via &amp;lt;code&amp;gt;com.openexchange.share.cleanup.guestExpiry&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt; - this value may also be set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to force an immediate removal&lt;br /&gt;
* For the removal of no longer needed guest user accounts, a periodical cleanup task is scheduled based on the interval of &amp;lt;code&amp;gt;com.openexchange.share.cleanup.periodicCleanerInterval&amp;lt;/code&amp;gt;&lt;br /&gt;
* Whether a cross-context database is considered for guest users may be configured via &amp;lt;code&amp;gt;com.openexchange.share.crossContextGuests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Guest Login &amp;amp;amp; Session Handling ==&lt;br /&gt;
&lt;br /&gt;
Based on the underlying guest user account, different login operations with different authentication workflows are possible.&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
&lt;br /&gt;
We have basically three different authentication options for guest users accessing a share, each of them having their own characteristics.&lt;br /&gt;
&lt;br /&gt;
==== Anonymous ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted without providing additional authentication information, the knowledge of the link is sufficient&lt;br /&gt;
* When accessing the share link, a guest session is spawned implicitly&lt;br /&gt;
* Initially supplied cookies are considered to recycle an existing session&lt;br /&gt;
* The login screen is skipped, we'll redirect to the module/folder/item directly (using appropriate URL fragments)&lt;br /&gt;
&lt;br /&gt;
==== Anonymous with PIN ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted for anonymous guest users providing a password / PIN code&lt;br /&gt;
* When accessing the share link, the client is redirected to the login screen of the webinterface, using &amp;lt;code&amp;gt;login_type=anonymous&amp;lt;/code&amp;gt;&lt;br /&gt;
* User can then enter his PIN code, client executes the &amp;lt;code&amp;gt;anonymous_login&amp;lt;/code&amp;gt; method, server authenticates, sends back a login response containing the target in the app suite webinterface (module/folder/item)&lt;br /&gt;
* Password can't be changed by an anonymous user&lt;br /&gt;
* Password can be re-constructed / changed by sharing user&lt;br /&gt;
&lt;br /&gt;
==== Guest without Password ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted without providing additional authentication information, the knowledge of the guest's individual link is sufficient&lt;br /&gt;
* When accessing the share link, a guest session is spawned implicitly&lt;br /&gt;
* Exiting cookies are considered to recycle an existing session&lt;br /&gt;
* The login screen is skipped, we'll redirect to the module/folder/item directly (using appropriate URL fragments)&lt;br /&gt;
* Guest user may choose an individual password at a later stage&lt;br /&gt;
&lt;br /&gt;
==== Guest with Password ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted for guest users providing a user name and password.&lt;br /&gt;
* Much similar to a regular groupware user&lt;br /&gt;
* When accessing the share link, the client is redirected to the login screen of the webinterface, using &amp;lt;code&amp;gt;login_type=guest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;login_name=&amp;amp;lt;NAME&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* The login name is used to pre-fill the username input&lt;br /&gt;
* User can then enter his password, client executes the &amp;lt;code&amp;gt;guest_login&amp;lt;/code&amp;gt; method, server authenticates, sends back a login response containing the target in the app suite webinterface (module/folder/item)&lt;br /&gt;
* Password can be changed by guest user&lt;br /&gt;
* Guest user may reset his password if he can't remember&lt;br /&gt;
&lt;br /&gt;
=== Guest Hostname ===&lt;br /&gt;
&lt;br /&gt;
For serving shares, a separate guest hostname needs to be configured. This is mainly required to prevent guest- and regular user sessions using the same cookie container when logged in in the same client (otherwise, the cookie holding the alternative session identifier as well as other cookies would get overwritten concurrently). Additionally, this allows to have separate entry points to the web client for guest- and regular users. &lt;br /&gt;
&lt;br /&gt;
The hostname for guests is used when generating external share links, as well as at other locations where hyperlinks are constructed in the context of guest users. Usually, the guest hostname refers to a separate subdomain of the installation like &amp;lt;code&amp;gt;share.example.com&amp;lt;/code&amp;gt;, and is defined as an additional named virtual host pointing to the web client's document root in the webserver's configuration. &lt;br /&gt;
&lt;br /&gt;
Once the webserver configuration is done and the web client is accessible using the guest hostname, this hostname needs to be specified in the backend configuration, too. In simple scenarios, where a fixed guest hostname should be used for the installation, this can be done statically in a configuration file. This setting may also be overridden per context via the Config Cascade. In case a dedicated hostname service is installed (for example &amp;lt;code&amp;gt;open-xchange-hostname-ldap&amp;lt;/code&amp;gt;), this hostname service is also supposed to supply the guest hostname. &lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The guest hostname may be specified via &amp;lt;code&amp;gt;com.openexchange.share.guestHostname&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The guest hostname may also be supplied via dedicated hostname services like &amp;lt;code&amp;gt;open-xchange-hostname-config-cascade&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;open-xchange-hostname-ldap&amp;lt;/code&amp;gt;&lt;br /&gt;
* For test purposes, guests may also access the web interface using the same host as regular users do, however, this might lead to unexpected results (missing images, sessions timing out, auto-login malfunction...)&lt;br /&gt;
&lt;br /&gt;
=== Cookies ===&lt;br /&gt;
&lt;br /&gt;
Guest sessions basically make use of the same cookies as regular user sessions do. This includes the JSESSONID cookie for the JVM route, as well as the &amp;lt;code&amp;gt;open-xchange-secret-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-public-session-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; cookies. Additionally, if configured, the client may also issue a &amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt; request to persist the open-xchange-session-&amp;lt;hash&amp;gt; cookie. This cookie may then be used to auto-login the guest client into the previously used session if it is still valid.&lt;br /&gt;
&lt;br /&gt;
Besides the common cookies, another special cookie is set: &amp;lt;code&amp;gt;open-xchange-share-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt;. The value contains the unique share token bound to the guest user accessing the share. here, the cookie hash is calculated as it's done for ordinary sessions, so that there can only be one &amp;lt;code&amp;gt;open-xchange-share-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; cookie in a client at the same time. Whenever an auto-login request is issued by the client, the server checks for the existence of this &amp;amp;quot;share&amp;amp;quot; cookie, and, once recognized and checked for validity, it will try to perform the auto-login for an existing guest session first, i.e. using the session cookie based on the special guest hash calculation outlined above. Otherwise, the common auto-login process takes place. The &amp;amp;quot;share&amp;amp;quot; cookie is removed once the guest session terminates, i.e. the guest user logs out.&lt;br /&gt;
&lt;br /&gt;
Since guest users access the web interface on a separate (sub)domain (see [[#Guest_Hostname|Guest Hostname]] above for details), guest session cookies won't interfere with cookies of a regular session on the same client. This allows to use the regular user session as well as one or more guest sessions in parallel - e.g. if the sharing user quickly wants to check how the contents appear for the guest user after generating a share link.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Whether guest sessions are enabled for auto-login is configurable via the property &amp;lt;code&amp;gt;com.openexchange.share.autoLogin&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* By default, the cookie TTL for guest sessions is inherited from the TTL for cookies of regular sessions as defined by &amp;lt;code&amp;gt;com.openexchange.cookie.ttl&amp;lt;/code&amp;gt; - this default may be overridden by defining a timespan at &amp;lt;code&amp;gt;com.openexchange.share.cookieTTL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Login Modes ===&lt;br /&gt;
&lt;br /&gt;
When accessing a share link, one of the following login modes is triggered to acquire a session and forward the client to the share target. The executed login operation and redirect depends on the authentication mode of underlying guest account, the share target iteself, and the client accessing the share.&lt;br /&gt;
&lt;br /&gt;
==== Redirect to Target ====&lt;br /&gt;
&lt;br /&gt;
In case a share is accessible without providing credentials, the client is redirected to the share target directly, i.e. without prompting for a username or password. By default, the client is redirected to the target in the App Suite web interface by responding the &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; request to the share link with &amp;lt;code&amp;gt;HTTP 302&amp;lt;/code&amp;gt;, and a location header like the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;session=80c711019d6f48b5bec9cd82758e3308&amp;amp;amp;store=true&amp;amp;amp;user=&amp;amp;amp;user_id=642&amp;amp;amp;context_id=1&amp;amp;amp;m=files&amp;amp;amp;f=41042&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The session for the guest user is created implicitly in the backend after checking the share link's validity, and the client is instructed to store appropriate cookies in the redirect response, including the &amp;amp;quot;share&amp;amp;quot; cookie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-secret-aNobP2G9wLHJ6sMr7vtTA=38ee770d6e4f42ab8366d91db3279931; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-public-session-d0759656127fb7cee6e0fe8bb5fe19f9=cae6a3e712ac429e9da9194abd389cb3; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-share-b7gDSqJpnh9gS3Fs52I65Q=0ad50ac00418fbcdad50ac1418f94fb181d51b8fa7b2bde3; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirect to Login Screen ====&lt;br /&gt;
&lt;br /&gt;
If additional credentials, i.e. an additional PIN code or username/password combination, are required to access a share target, and no &amp;amp;quot;special client&amp;amp;quot; like an iCal consumer is detected by the backend, the client is redirected to the login screen of the app suite webinterface. The GET request to the share link is answered with statuscode HTTP 302, and a location header depending on the required credentials to access the share.&lt;br /&gt;
&lt;br /&gt;
If the share ought to be accessed anonymously, but protected by a PIN code, a location like the following is added to the response header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;share=08b4b6110151f1bd7d4b610151f0405d9fc8bb89a887f04e&amp;amp;amp;login_type=anonymous&amp;amp;amp;message_type=INFO&amp;amp;amp;message=Tony%20Parker%20has%20shared%20the%20folder%20%22Pictures%22%20with%20you.%20Please%20log%20in%20to%20view%20it.%20&amp;amp;amp;target=151ebb38&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For shares to dedicated guest users identified by their e-mail address, the redirect location looks like follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;share=4ac9eb590f9ca4d2ac9eb58f9ca611ec9b4f4638d288c8c0&amp;amp;amp;login_type=guest&amp;amp;amp;message_type=INFO&amp;amp;amp;message=Tony%20Parker%20has%20shared%20the%20file%20%22Agenda.pdf%22%20with%20you.%20Please%20log%20in%20to%20view%20it.%20&amp;amp;amp;login_name=ray%40example.com&amp;amp;amp;target=4444cbc7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The redirect response already contains the &amp;lt;code&amp;gt;Set-Cookie&amp;lt;/code&amp;gt; header for the JVM route. On the redirect target, the client should request the PIN code or password from the user, and then issue a special login request, supplying the share token and optional target from the URL parameters, and the password as URL encoded form data in the request body, similar to the usual login request via POST. After successful authentication, the login response includes, along with the common login response properties like the session identifier, information about the share target being accessed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;amp;quot;session&amp;amp;quot;:&amp;amp;quot;b89af2c2ce494ce4b4573c0632b48e89&amp;amp;quot;,&amp;amp;quot;user&amp;amp;quot;:&amp;amp;quot;ray@example.com&amp;amp;quot;,&amp;amp;quot;user_id&amp;amp;quot;:660,&amp;amp;quot;context_id&amp;amp;quot;:1,&amp;amp;quot;locale&amp;amp;quot;:&amp;amp;quot;en_US&amp;amp;quot;,&amp;amp;quot;module&amp;amp;quot;:&amp;amp;quot;files&amp;amp;quot;,&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;10&amp;amp;quot;,&amp;amp;quot;item&amp;amp;quot;:&amp;amp;quot;10/456398&amp;amp;quot;, ... }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the client is instructed to store the secret cookies:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-share-b7gDSqJpnh9gS3Fs52I65Q=0ac9eb590f9ca4d5ac9eb58f9ca641ec9b4f4638d288c8a0; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-secret-MBIRg9bJBLduCcosqQBCw=70187de16f844be6880c18be373b953d; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-public-session-d0759656127fb7cee6e0fe8bb5fe19f9=4e797a59758a4dd7b763912472ccf26d; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afterwards, the client is able to use the session to access the share target as usual.&lt;br /&gt;
&lt;br /&gt;
=== Session Lifecycle ===&lt;br /&gt;
&lt;br /&gt;
Generally, guest sessions on the server are treated just like the sessions of ordinary users. Especially, guest sessions are also held in the local session containers of the backend host they're associated with. However, by default guest sessions are marked as &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt;, i.e. they are not moved to the long-term session containers, nor they are put into the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Guest sessions are also accounted in the monitoring outputs (e.g. in the sessions per container graphs)&lt;br /&gt;
* The &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt; handling of guest sessions may be changed via the property &amp;lt;code&amp;gt;com.openexchange.share.transientSessions&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logout ===&lt;br /&gt;
&lt;br /&gt;
Guest sessions are terminated once a logout request is issued by the client, i.e. the user clicks the &amp;amp;quot;Logout&amp;amp;quot; button in the web interface, just like it is done for regular sessions. Additionally, guest sessions expire in the backend when not being used for a while, the actual timeout depends on the configured default session lifetime and whether they are treated as &amp;amp;quot;transient&amp;amp;quot; or not, as explained above.&lt;br /&gt;
&lt;br /&gt;
Since guest users are not able to use the default login page for regular users, a custom logout location for guest users should be specified where guest users are taken to after clicking logout explicitly, or if their session expired.&lt;br /&gt;
&lt;br /&gt;
If a share is consumed &amp;amp;quot;directly&amp;amp;quot;, e.g. by downloading the binary contents of a file share directly (see [[#Consuming_Shares|Consuming Shares]] for details), the guest sessions is terminated instantly after serving the request.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The logout location for guest accounts can be customized via &amp;lt;code&amp;gt;guestLogoutLocation&amp;lt;/code&amp;gt; in the file &amp;lt;code&amp;gt;as-config.yml&amp;lt;/code&amp;gt; (see file &amp;lt;code&amp;gt;as-config-default.yml&amp;lt;/code&amp;gt; for an example)&lt;br /&gt;
&lt;br /&gt;
== Share Notifications ==&lt;br /&gt;
&lt;br /&gt;
With the new sharing concept, notification mails can be sent out to the permission entities (i.e. internal or guest users) of folders or items. Mechanisms exist to send out such mails implicitly or explicitly. Notifications are sent out implicitly, if externals are invited as guests and can also be sent out for internal invitations, if configured so. The client (e.g. App Suite UI) decides on its own whether implicit notifications shall be sent when updating a folders or items permissions. Besides there are separate API calls for sending out notification messages explicitly. Its on the client to provide this functionality to its users. This makes it possible to re-send a link to a folder or item to an existing permission entity.&lt;br /&gt;
&lt;br /&gt;
Sending out links to shared folders and items is not the only case for notification messages, it can also be necessary to send out system notifications to guest users. Currently this is the case when a guest user secured his account with a password and needs to reset that password, because he cannot remember.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* A special transport must be configured for system notifications and cases where the sharing user has no configured webmail account. This transport is configured in &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt;. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
* It is possible to disable the implicit notification of internal users about shared folders or items at all by setting &amp;lt;code&amp;gt;com.openexchange.share.notifyInternal&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The layout of notifications mails can be changed via &amp;lt;code&amp;gt;as-config.yml&amp;lt;/code&amp;gt;. All available properties are defined and explained in &amp;lt;code&amp;gt;as-config-defaults.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API Access ==&lt;br /&gt;
&lt;br /&gt;
From a client's point of view, guest users basically don't differ from regular users, although they usually have limited capabilities, for example no mail access or no personal folders. However, all those differences are reflected within the regular permission- and capability-concepts, so that existing clients, once the guest user is authenticated and has a valid session, continue to work transparently, and use the same API calls as with a regular groupware user.&lt;br /&gt;
&lt;br /&gt;
To create or manage shares and guest users, the HTTP API has been extended at various locations. The following list gives an overview about the changes, derived from the corresponding software change requests.&lt;br /&gt;
&lt;br /&gt;
=== Format change for object identifiers of the default &amp;amp;quot;infostore&amp;amp;quot; account ===&lt;br /&gt;
&lt;br /&gt;
As preparation for individual object permissions where a file can be accessed from different folder &amp;amp;quot;views&amp;amp;quot;, the object IDs for documents in the default &amp;amp;quot;infostore&amp;amp;quot; file storage account will get enhanced with the prefixing folder ID.&lt;br /&gt;
&lt;br /&gt;
The identifiers will now be of format &amp;lt;code&amp;gt;&amp;amp;lt;some numbers&amp;amp;gt;/&amp;amp;lt;more numbers&amp;amp;gt;&amp;lt;/code&amp;gt;. Object identifiers are already of type &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, so this change should usually be transparent to clients. However, there may be some clever clients out there that for example tried to interpret the string of numerical characters as number, so client developers should double-check their implementation for compatibility. They most likely would run into trouble when coping with non-infostore file storages anyway.&lt;br /&gt;
&lt;br /&gt;
=== Object permissions for files ===&lt;br /&gt;
&lt;br /&gt;
In order to define permissions on object-level, a new property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; for objects of type &amp;lt;code&amp;gt;infoitem&amp;lt;/code&amp;gt; is introduced. Each time the underlying folder permissions are not sufficient to access an item, those object permissions are taken into account. Object permissions are stored as an array of Object Permission objects as defined below within the detailed infoitem data, the column ID is &amp;lt;code&amp;gt;108&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Details about the JSON structure are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedInfoitemData HTTP API: Detailed Infoitem Data]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionObject HTTP API: Object Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionFlags HTTP API: Object Permission Flags]&lt;br /&gt;
&lt;br /&gt;
=== New field for &amp;amp;quot;user&amp;amp;quot; data: &amp;amp;quot;guest_created_by&amp;amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
A new property has been introduced for users that needs to be exposed in our HTTP API, too. The following property is added to the detailed user data object:&lt;br /&gt;
&lt;br /&gt;
* ID: 616&lt;br /&gt;
* Name: guest_created_by&lt;br /&gt;
* Type: Number&lt;br /&gt;
* Value: Contains the ID of the user who has created this guest in case this user represents a guest user; it is 0 for regular users&lt;br /&gt;
&lt;br /&gt;
The property is read-only and can't be removed or set by clients.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedUserData HTTP API: Detailed User Data]&lt;br /&gt;
&lt;br /&gt;
=== Extend folder- and object permissions for addressing external guests ===&lt;br /&gt;
&lt;br /&gt;
For sharing files- or folders to external guests, the folder- and object permission objects are extended with additional properties. Those extended properties can be set during creation or update of the parent folder or file. The underlying shares and guest user entities for the referenced recipients are created automatically along with folder/file creation/update. Afterwards, the external recipients appear as regular &amp;amp;quot;user&amp;amp;quot; entities in the permission arrays in subsequent &amp;amp;quot;get&amp;amp;quot; requests.&lt;br /&gt;
&lt;br /&gt;
Details about the extended JSON structure are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#PermissionObject HTTP API: Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionObject HTTP API: Object Permission Object]&lt;br /&gt;
&lt;br /&gt;
=== New Ajax module: share/management ===&lt;br /&gt;
&lt;br /&gt;
To work with shares, a new Ajax module is introduced.&lt;br /&gt;
&lt;br /&gt;
The available actions in the module are described at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Module_.22share.2Fmanagement.22_.28preliminary.2C_available_with_v7.8.0.29 HTTP API: Module share management]&lt;br /&gt;
&lt;br /&gt;
=== New column &amp;amp;quot;shareable&amp;amp;quot; in detailed infoitem data ===&lt;br /&gt;
&lt;br /&gt;
Clients want to know quickly if an infostore item is shareable or not. A new (read-only) property named &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt; of type Boolean with column identifier &amp;lt;code&amp;gt;109&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;detailed infoitem data&amp;amp;quot;. If &amp;amp;quot;true&amp;amp;quot;, the can be considered as shareable, i.e. the item's object permissions may be adjusted by the user.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedInfoitemData HTTP API: Detailed Infoitem Data]&lt;br /&gt;
&lt;br /&gt;
=== New action &amp;amp;quot;shares&amp;amp;quot; in module folder ===&lt;br /&gt;
&lt;br /&gt;
To provide an overview of all folders of a certain modules that are shared to others, a new &amp;lt;code&amp;gt;shares&amp;lt;/code&amp;gt; action is added to the Ajax module &amp;lt;code&amp;gt;folders&amp;lt;/code&amp;gt;. It returns all personal folders of a certain module that are shared to other entities.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Get_shared_folders_.28Since_7.8.0.2C_Preliminary.29 HTTP API: Get shared folders]&lt;br /&gt;
&lt;br /&gt;
=== New action &amp;amp;quot;shares&amp;amp;quot; in module infostore ===&lt;br /&gt;
&lt;br /&gt;
To provide an overview of all files that are shared to others, a new &amp;lt;code&amp;gt;shares&amp;lt;/code&amp;gt; action is added to the Ajax module &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt;. It returns all personal files that are shared to other entities.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Get_shared_infoitems_.28Since_7.8.0.2C_Preliminary.29 HTTP API: Get shared infoitems]&lt;br /&gt;
&lt;br /&gt;
=== New fields to retrieve extended permissions of files and folders ===&lt;br /&gt;
&lt;br /&gt;
Clients would like to have more details about permission entities folders directly. A new read-only property named &amp;lt;code&amp;gt;com.openexchange.share.extendedPermissions&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;Detailed folder data&amp;amp;quot;, with column identifier &amp;lt;code&amp;gt;3060&amp;lt;/code&amp;gt;. It basically contains the same as the regular &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; array, yet enhanced by resolved information about the user, group or guest entities as well as additional, sharing-related properties.&lt;br /&gt;
&lt;br /&gt;
Similarly, a new read-only property named &amp;lt;code&amp;gt;com.openexchange.share.extendedObjectPermissions&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;Detailed infoitem data&amp;amp;quot;, with column identifier &amp;lt;code&amp;gt;7010&amp;lt;/code&amp;gt;. It basically contains the same as the regular &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; array, yet enhanced by resolved information about the user, group or guest entities as well as additional, sharing-related properties.&lt;br /&gt;
&lt;br /&gt;
Further information about the JSON structure is available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ExtendedPermissionObject HTTP API: Extended Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ExtendedObjectPermissionObject HTTP API: Extended Object Permission Object]&lt;br /&gt;
&lt;br /&gt;
== Consuming Shares ==&lt;br /&gt;
&lt;br /&gt;
Depending on the shared contents and the requesting user agent, shares may be consumed in a couple of different ways. The concrete response to a request to the share URL is evaluated by the share servlet in the backend.&lt;br /&gt;
&lt;br /&gt;
=== App Suite ===&lt;br /&gt;
&lt;br /&gt;
The default handling for all shares is forwarding them to the App Suite web interface, where the shared contents are made available through the existing client. Based on the underlying guest account, the client is either forwarded to the login prompt, or taken directly to the share target if no credentials need to be provided. This process is described in more detail at [[#Guest_Login_&amp;amp;_Session_Handling|Guest Login &amp;amp;amp; Session Handling]].&lt;br /&gt;
&lt;br /&gt;
=== Direct Download ===&lt;br /&gt;
&lt;br /&gt;
Shares to a single file may also be downloaded directly by clients, without opening them in the web interface first. This is indicated by an additional parameter appended to the plain share link, and can be specified in the following ways:&lt;br /&gt;
&lt;br /&gt;
* Append &amp;lt;code&amp;gt;dl&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?dl=true&amp;lt;/code&amp;gt;&lt;br /&gt;
* Specify &amp;lt;code&amp;gt;delivery&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?delivery=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If accessing the item requires authentication, an unauthenticated request is responded with &amp;lt;code&amp;gt;HTTP 401 Unauthorized&amp;lt;/code&amp;gt;. The client then has to provide the correct credentials to access the share via basic authentication. If there's no dedicated username for the underlying guest account - i.e. an &amp;amp;quot;anonymous&amp;amp;quot; share link protected with a PIN code is accessed - only the password is checked, i.e. the client may then supply an arbitrary username in the basic authentication header like &amp;amp;quot;Guest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get iCal ===&lt;br /&gt;
&lt;br /&gt;
Shares to a single calendar- or task-folder may also be downloaded directly by clients as iCal files, without opening them in the web interface first. This standard format allows to consume event data directly using various calendaring clients, which often can be configured to subscribe an external calendar source.&lt;br /&gt;
&lt;br /&gt;
Once a share link to a calendar- or task-folder is requested by the client, the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt;- and &amp;lt;code&amp;gt;User-Agent&amp;lt;/code&amp;gt; headers of the request are evaluated. If the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; header is either set to &amp;lt;code&amp;gt;text/calendar&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text/iCal&amp;lt;/code&amp;gt;, or if the &amp;lt;code&amp;gt;User-Agent&amp;lt;/code&amp;gt; header denotes a well-known client like Microsoft Outlook or Mozilla Thunderbird w/ Lightning, the contents of the shared folder are converted to an iCal file that is directly written back in the response.&lt;br /&gt;
&lt;br /&gt;
To force the iCal output, an additional parameter may be appended to the plain share link:&lt;br /&gt;
&lt;br /&gt;
* Append &amp;lt;code&amp;gt;ical&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?ical=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If accessing the item requires authentication, an unauthenticated request is responded with &amp;lt;code&amp;gt;HTTP 401 Unauthorized&amp;lt;/code&amp;gt;. The client then has to provide the correct credentials to access the share via basic authentication. If there's no dedicated username for the underlying guest account - i.e. an &amp;amp;quot;anonymous&amp;amp;quot; share link protected with a PIN code is accessed - only the password is checked, i.e. the client may then supply an arbitrary username in the basic authentication header like &amp;amp;quot;Guest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The interval of task- and appointment data considered for conversion to iCal can be adjusted via &amp;lt;code&amp;gt;com.openexchange.share.handler.iCal.futureInterval&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;com.openexchange.share.handler.iCal.pastInterval&amp;lt;/code&amp;gt; in configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cross-context functionality ==&lt;br /&gt;
&lt;br /&gt;
As already mentioned in previous sections the administrator is able to configure if guests should be handled per context (default) or server wide by using the configuration parameter &amp;lt;code&amp;gt;com.openexchange.share.crossContextGuests&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the guests email address is used to recognize if there is already a registered user with the given address and aligns the stored password to the already existing guest user. In addition to the password (which is the most important parameter this feature is about) even the users contact data gets synchronized.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* To handle user and contact data across contexts boundaries the feature has to be enabled before a guest receives the first share. Guests that receive shares before the activation cannot be considered within the alignment process. Only latter shares will be considered.&lt;br /&gt;
* At the moment this feature does only sync user and contact related data (no shared content). If the user got two shares from different contexts he will only see shares related to the given link.&lt;br /&gt;
&lt;br /&gt;
== Publish/Subscribe vs. Sharing ==&lt;br /&gt;
&lt;br /&gt;
The upcoming sharing features are going to replace the previously used OXMF &amp;amp;quot;publications&amp;amp;quot;, allowing guest users to interact with the shared data in the same way as regular groupware users do. However, since the underlying concepts and their technical realization are completely different, a seamless migration between publications and shares is not possible without some drawbacks.&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview of the main discrepancies:&lt;br /&gt;
&lt;br /&gt;
* Custom templates for OXMF publication targets&amp;lt;br /&amp;gt;An adminsitrator/admin may have defined some custom publication targets that are using the published data in a special way. While shares would still make all the data available (mainly via the web interface), this would only be a drop-in replacement for the ordinary &amp;amp;quot;view the publication in a browser&amp;amp;quot; use case, but not for anything beyond that scope.&lt;br /&gt;
* Subscribe of publications&amp;lt;br /&amp;gt;Publications from one user can be added to another user's groupware using the &amp;amp;quot;subscribe&amp;amp;quot; functionality, making use of the embedded microformat data of publications (OXMF). For sharing, we will not have a similar feature in the first iteration, so migrating an existing publication to a share would also stop it from being subscribable.&lt;br /&gt;
* Deep links to download files of publications&amp;lt;br /&amp;gt;Files behind an infostore publication were accessible behind a static URL, which would theoretically allow them to be requested independently of the parent publication (e.g. images linked from an external website). While the entry URL to a publication would be mappable to a corresponding share URL, converting existing publications to shares would at least break such deep links.&lt;br /&gt;
&lt;br /&gt;
Because of the above points and the whole different concept, we do not migrate existing publications to shares. Instead, the default behavior will be:&lt;br /&gt;
&lt;br /&gt;
* No new OXMF publications or subscriptions can be created by default&lt;br /&gt;
* The web client does no longer give the option to publish or subscribe in the OXMF format&lt;br /&gt;
* Existing OXMF publications / subscriptions can't be updated&lt;br /&gt;
* Existing OXMF publications continue to work as is, including associated subscriptions&lt;br /&gt;
* Yet it's still possible to delete existing publications and subscriptions&lt;br /&gt;
* Therefore, the menu section &amp;amp;quot;Publications and Subscriptions&amp;amp;quot; will still be available (if there's at least one publication or subscription)&lt;br /&gt;
&lt;br /&gt;
Exceptions to these rules cover special internal subscriptions to 3rd party services like addressbooks from LinkedIn or Xing, as well as the auto-publish feature of mail attachments exceeding a specific size.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The possibility to create/update OXMF publications via HTTP-API may be configured via &amp;lt;code&amp;gt;com.openexchange.publish.createModifyEnabled&amp;lt;/code&amp;gt; in file &amp;lt;code&amp;gt;publications.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* The possibility to create/update OXMF subscriptions via HTTP-API may be configured via &amp;lt;code&amp;gt;com.openexchange.subscribe.microformats.createModifyEnabled&amp;lt;/code&amp;gt; in file &amp;lt;code&amp;gt;microformatSubscription.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;br /&gt;
[[Category: Administrator]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode&amp;diff=21475</id>
		<title>AppSuite:Sharing and Guest Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode&amp;diff=21475"/>
		<updated>2016-02-12T14:04:09Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Sharing and Guest Mode&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Starting with v7.8.0, the Open-Xchange server comes with a whole new concept to share contents with external people, allowing guest users to interact with the shared data in the same way as regular groupware users do. This article describes the underlying technical implications and outlines the different use cases.&lt;br /&gt;
&lt;br /&gt;
The main idea behind the new sharing concept is that guest users, i.e. external users without a regular account on the server, should be able to access the shared contents using the existing interfaces, especially the App Suite web interface. On the one hand, this includes consuming the shared data using the App Suite's advanced media viewing capabilities. On the other hand, this enables guests to edit existing as well as to create or upload new content in the groupware. Even real-time collaboration between internal users and guests in OX Documents is possible.&lt;br /&gt;
&lt;br /&gt;
The following chapters cover different topics regarding sharing and guest users and try to describe some technical background and impact where hosters, administrators or integrators might be interested in.&lt;br /&gt;
&lt;br /&gt;
== Creating Shares ==&lt;br /&gt;
&lt;br /&gt;
Basically, creating a share means adding an additional permission entity to the shared folder or item. Previously, this was only possible for &amp;amp;quot;internal&amp;amp;quot; entities, i.e. regular users or user groups. Now, the underlying permission system has been extended to support external entities, which can be either invited guest users, or special &amp;amp;quot;anonymous&amp;amp;quot; guest users who access a shared folder or item via a secret link. Anonymous and invited guest users are explained in more detail below.&lt;br /&gt;
&lt;br /&gt;
Sharing is available for the groupware modules Calendar, Contacts, Tasks and Drive (a.k.a. Infostore/Files). While the latter one also allows &amp;quot;writable&amp;quot; access for invited guest users, folders from the Calendar, Contacts and Tasks module may only be published in &amp;quot;read-only&amp;quot; mode to external guests.&lt;br /&gt;
&lt;br /&gt;
=== Invite Guests ===&lt;br /&gt;
&lt;br /&gt;
To share something to a guest user, it's possible to just add the e-mail address of the invitee as new permission entity for files and folders. The middleware then takes care to provision a new or reuse an existing account for the guest user, and equips him with the required permissions for accessing the contents. So, from a client's point of view, sharing something to a guest user is mostly the same process as sharing something to an internal user or group.&lt;br /&gt;
&lt;br /&gt;
=== Share Links ===&lt;br /&gt;
&lt;br /&gt;
Besides explicitly inviting a guest user to a share, it's also possible to just get a secret link for a folder or item. This will result in an additional &amp;amp;quot;anonymous&amp;amp;quot; guest entity in the permissions of the shared object, and will grant any user with the corresponding share link access the shared contents. To simplify the creation of share links, the clients will offer an additional &amp;amp;quot;wizard&amp;amp;quot; to quickly get a share link for a folder or item. Unlike invited guests which behave much like internal users, anonymous guest entities are strictly bound to the underlying folder or item, i.e. there is at most one anonymous permission entity per file or folder, as well as an anonymous permission entity can only be used for only once.&lt;br /&gt;
&lt;br /&gt;
=== Required Permissions and Capabilities ===&lt;br /&gt;
&lt;br /&gt;
Whether a user is allowed to create share links, invite external guests, or internal groups or users, depends on the following module access permissions and capabilities. Please note that share links no longer require &amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt; since Open-Xchange v7.8.1; this restriction was removed in order to allow simple publications also for non-groupware accounts, e.g. as defined by the &amp;lt;code&amp;gt;pim&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;pim_infostore&amp;lt;/code&amp;gt; module access combinations.&lt;br /&gt;
&lt;br /&gt;
* Create, update &amp;amp; remove share links ''(in v7.8.0)'': &amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt;&lt;br /&gt;
* Create, update &amp;amp; remove share links ''(in v7.8.1 and above)'': &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove internal users and group permissions: &amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add, update or remove internal users and group permissions: &amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Existing shares for a guest user or context may be listed using the commandline utility &amp;lt;code&amp;gt;listshares&amp;lt;/code&amp;gt;&lt;br /&gt;
* The ability to create share links may be controlled via &amp;lt;code&amp;gt;com.openexchange.capability.share_links&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;permissions.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The ability to invite guest users may be controlled via &amp;lt;code&amp;gt;com.openexchange.capability.invite_guests&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;permissions.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The number of allowed share links per user may be specified via &amp;lt;code&amp;gt;com.openexchange.quota.share_links&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The number of allowed guest invitations per user may be specified via &amp;lt;code&amp;gt;com.openexchange.quota.invite_guests&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
&lt;br /&gt;
== Removing Shares ==&lt;br /&gt;
&lt;br /&gt;
The lifetime of shares is implicitly bound to the lifetime of the associated permission of the guest user entity. So, once a permission entity pointing to a (named or anonymous) guest user account is removed from the parent folder or item, this also leads to the removal of the associated share itself. Afterwards, the contents are no longer accessible for the guest user. For shares that were created with a specific expiry date, it is ensured that they can no longer be accessed via their share link after expiring. Additionally, expired shares are cleaned up periodically within a background task.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Shares may be revoked manually using the commandline utility &amp;lt;code&amp;gt;removeshares&amp;lt;/code&amp;gt;&lt;br /&gt;
* The interval of the periodic cleanup task can be controlled via &amp;lt;code&amp;gt;com.openexchange.share.cleanup.periodicCleanerInterval&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Share Links &amp;amp;amp; Tokens ==&lt;br /&gt;
&lt;br /&gt;
Shares are accessed with a hyperlink that contains the so-called share &amp;amp;quot;token&amp;amp;quot;. This 24-byte token uniquely identifies the associated guest account on the system, and carries enough randomness that it can't be guessed. Explicitly invited guest users receive this hyperlink in the invitation mail to a share, while in case of an &amp;amp;quot;anonymous&amp;amp;quot; share where just the link itself was generated, it's up to the sharing user to distribute the link on his own. Besides the token, a share link may contain an additional path that points to the concrete folder and item, which just aids to jump to the shared item in the web interface directly. The following shows an example of a share link:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://share.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/1/2/ODAxMDY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a guest user has been invited to more than one share in a context (based on his e-mail address), his individual share token remains equal, so that he will have access to all shared contents in the web interface after following any of the share links he received. However, the additional &amp;amp;quot;path&amp;amp;quot; still points to the concrete item. When inviting more than one guest user to the same share, each recipient will get his own individual share link.&lt;br /&gt;
&lt;br /&gt;
Once the share URL is requested from the server, the associated guest account is looked up and, depending of the guest type, the request is redirected to a specific login screen or directly into the App Suite web interface. More details regarding the different login modes are described at [[#Guest_Login_&amp;amp;_Session_Handling|Guest Login &amp;amp;amp; Session Handling]].&lt;br /&gt;
&lt;br /&gt;
After a share has been revoked (either explicitly, by removing the permission, or if the share is expired), share links can't be accessed any longer, and, after the last share for the guest user was removed, the guest account is removed from the system automatically.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The share token is stored as user attribute &amp;lt;code&amp;gt;com.openexchange.shareBaseToken&amp;lt;/code&amp;gt; in the corresponding guest user account&lt;br /&gt;
* The target database schema for a share and the associated guest account is extracted from the context identifier encoded in the share token&lt;br /&gt;
&lt;br /&gt;
== Guest Users ==&lt;br /&gt;
&lt;br /&gt;
As outlined above, guest users are created on demand once something is being shared. We basically distinguish between two types of guest users: Those that were invited explicitly by the sharing user, or &amp;amp;quot;anonymous&amp;amp;quot; guest users that are able to access by visiting the share link. Access for the latter one may optionally be secured with a fixed PIN code.&lt;br /&gt;
&lt;br /&gt;
For both kinds of guest users, a corresponding user account is provisioned dynamically on the system once a new share is created. Such a guest account is handled much similar as an account for a regular user, with the following main exceptions:&lt;br /&gt;
&lt;br /&gt;
* No access to the &amp;amp;quot;Mail&amp;amp;quot; module&lt;br /&gt;
* No personal folders&lt;br /&gt;
* No access to the &amp;amp;quot;Portal&amp;amp;quot;&lt;br /&gt;
* No access to the global address book&lt;br /&gt;
* Module access is restricted to only include modules from the actual shares&lt;br /&gt;
&lt;br /&gt;
All those restrictions are configured and enforced using the built-in mechanisms of the Open-Xchange Server, i.e. by a reduced set of capabilities (i.e. module permissions), or by selectively set permission bits in the folder tree for the virtual guest group. This ensures that guest users are only able to access things they explicitly have been invited to, as well as a transparent handling of guest accounts within all subsystems.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Guest users are stored much similar as regular users in the database (tables &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prg_contacts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_attribute&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_configuration&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Additionally, the identifier of the user who (initially) created the guest account is stored in &amp;lt;code&amp;gt;user.guestCreatedBy&amp;lt;/code&amp;gt;, i.e. if this column is not &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, this entry refers to a guest user&lt;br /&gt;
* All service calls and APIs that list or search users have been adjusted to be &amp;amp;quot;guest-aware&amp;amp;quot;, i.e. by default, guests users are not included in the output, yet may be included explicitly with additional parameters (namely &amp;lt;code&amp;gt;includeGuests&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;excludeUsers&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Service calls and APIs that request data explicitly based on an entity's identifier are also working with guest users, i.e. if a specific idnetifier points to a guest, then the referenced guest data is returned&lt;br /&gt;
&lt;br /&gt;
=== Capabilities ===&lt;br /&gt;
&lt;br /&gt;
Guest users always have the &amp;lt;code&amp;gt;guest&amp;lt;/code&amp;gt; capability set. Besides they are generally configured with a limited permission set, that allows them just to work with their shared items. This permission set includes:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Permission&lt;br /&gt;
!Capability&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;deniedportal&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|No &amp;lt;code&amp;gt;portal&amp;lt;/code&amp;gt; capability&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;editpublicfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;edit_public_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;readcreatesharedfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;editpassword&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;edit_password&amp;lt;/code&amp;gt;&lt;br /&gt;
|Only for invited guests, not links&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Additionally, for every module the guest is having shared items in, the according module permission is granted, e.g. a shared drive folder results in permission &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt; and the according capability. Guest users are never allowed to share folders or items on their own, i.e. the capabilities &amp;lt;code&amp;gt;share_links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;invite_guests&amp;lt;/code&amp;gt; can never be set.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
This limited capability set can be extended by configuration. Currently three modes are supported:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Mode&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|deny_all&lt;br /&gt;
|No further capabilities are applied to guest users, except ones that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|static&lt;br /&gt;
|A static list of capabilities is applied to guest users via the &amp;lt;code&amp;gt;com.openexchange.share.staticGuestCapabilities&amp;lt;/code&amp;gt; property. Additionally capabilities that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt; are applied.&lt;br /&gt;
|-&lt;br /&gt;
|inherit&lt;br /&gt;
|All capabilities of the user who &amp;amp;quot;created&amp;amp;quot; the guest, i.e. created the link or initially invited somebody, are applied to the guest user. Additionally capabilities that have been explicitly set for the guest user via &amp;lt;code&amp;gt;changeuser --capabilities-to-add&amp;lt;/code&amp;gt; are applied.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The mode can be configured via the &amp;lt;code&amp;gt;com.openexchange.share.guestCapabilityMode&amp;lt;/code&amp;gt; property in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;. This property is config-cascade capable, so it can for example be overridden for certain sets of contexts. The same applies to the &amp;lt;code&amp;gt;com.openexchange.share.staticGuestCapabilities&amp;lt;/code&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
Due to this configuration mechanism it is possible to increase the user experience for guests and even allow some real collaboration. As an example one could apply the following configuration to allow guests to see preview images of files and edit shared documents with OX Text and OX Spreadsheet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;com.openexchange.share.guestCapabilityMode = static&lt;br /&gt;
com.openexchange.share.staticGuestCapabilities = document_preview, text, spreadsheet&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anonymous Guest Users ===&lt;br /&gt;
&lt;br /&gt;
If a &amp;amp;quot;share link&amp;amp;quot; is created, this results in an implicit creation of an anonymous guest user account on the server. The &amp;amp;quot;secret&amp;amp;quot; to access the shared contents is the share token itself that is encoded in the generated share link, so that everybody that knows the share link is able to access the shared contents. Optionally, such an anonymous share link may be secured with an additional PIN code. Guest users will be prompted to enter this PIN code when attempting to access the share.&lt;br /&gt;
&lt;br /&gt;
To have a strict separation between different shared contents, each time a folder or item is shared using the &amp;amp;quot;Get a link&amp;amp;quot; method, a designated anonymous guest account for this share is used. Consequently, each time such an anonymous share is revoked, this guest account is terminated again with no further delay. Additionally, such an anonymous guest entity can only be applied to the permission set of the folder or item the original link was created for, i.e. it's not possible to add more shared contents to an anonymous guest - in contrast to an invited, named guest user.&lt;br /&gt;
&lt;br /&gt;
Besides the common restrictions for guest accounts outlined above, the following applies for anonymous guest user accounts:&lt;br /&gt;
&lt;br /&gt;
* No e-mail address or display name&lt;br /&gt;
* No password, if no PIN was assigned by the sharing user&lt;br /&gt;
* A password that may only be changed by editing the link, if a PIN code was set&lt;br /&gt;
* Anonymous guest users may only receive &amp;amp;quot;read-only&amp;amp;quot; access permissions to the shared item&lt;br /&gt;
* Optionally, an expiry date can be applied for an anonymous guest user after which the share link is no longer accessible&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The PIN code for anonymous guest users is stored using symmetrical encryption in the database, therefore, an encryption key needs to be specified via the property &amp;lt;code&amp;gt;com.openexchange.share.cryptKey&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Named Guest Users ===&lt;br /&gt;
&lt;br /&gt;
Internal users are able to invite a guest user to a folder or item explicitly by specifying the e-mail address of the recipient. Such &amp;amp;quot;named&amp;amp;quot; guest users are internally stored as individual guest users, identified by their e-mail address.&lt;br /&gt;
&lt;br /&gt;
If data is shared for the first time to the recipient in the context, a new guest user account is provisioned and an initial set of user permissions and capabilities is assigned. In case there are already shares in different contexts to the same recipient (based on his e-mail address), some existing user data like a display name or an assigned password is copied over if a cross-context database is available on the system.&lt;br /&gt;
&lt;br /&gt;
If the recipient has already been invited from the same or another internal user in the context to another share before, the new share is added to the guest user in a way that the underlying folder- and object permissions are taken over, and the user capabilities getting expanded as needed to cover all modules the shares are located in. Similarly, if a share to a named guest user is revoked and the underlying folder- and object-permissions are removed, the guest user capabilities are updated implicitly to reflect the modules of the remaining shares.&lt;br /&gt;
&lt;br /&gt;
After the last share to a named guest user has been revoked, the user has no longer access to any data. The account itself gets removed from the context automatically after a configurable expiry time. Additionally, any data that is stored for the guest user in the cross-context database is removed once the guest user has been deleted from all contexts in the system.&lt;br /&gt;
&lt;br /&gt;
In contrast to an &amp;amp;quot;anonymous&amp;amp;quot; guest user, a named guest user has access to all shared items from a context after logging in, since the permissions get added to an existing guest user account automatically. For entering the web interface, he may use any of the share links that were sent to him in the different notification messages. Those links usually point to an individual share target like a folder or file, but the guest user may navigate to the other shared contents using the folder tree of the web interface in the same way as regular groupware users do. Similarly, if the guest user has access to shares from different modules, the modules can be switched in the web interface as usual.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The timespan after which an unused named guest user should be removed from the system can be configured via &amp;lt;code&amp;gt;com.openexchange.share.cleanup.guestExpiry&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt; - this value may also be set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to force an immediate removal&lt;br /&gt;
* For the removal of no longer needed guest user accounts, a periodical cleanup task is scheduled based on the interval of &amp;lt;code&amp;gt;com.openexchange.share.cleanup.periodicCleanerInterval&amp;lt;/code&amp;gt;&lt;br /&gt;
* Whether a cross-context database is considered for guest users may be configured via &amp;lt;code&amp;gt;com.openexchange.share.crossContextGuests&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Guest Login &amp;amp;amp; Session Handling ==&lt;br /&gt;
&lt;br /&gt;
Based on the underlying guest user account, different login operations with different authentication workflows are possible.&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
&lt;br /&gt;
We have basically three different authentication options for guest users accessing a share, each of them having their own characteristics.&lt;br /&gt;
&lt;br /&gt;
==== Anonymous ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted without providing additional authentication information, the knowledge of the link is sufficient&lt;br /&gt;
* When accessing the share link, a guest session is spawned implicitly&lt;br /&gt;
* Initially supplied cookies are considered to recycle an existing session&lt;br /&gt;
* The login screen is skipped, we'll redirect to the module/folder/item directly (using appropriate URL fragments)&lt;br /&gt;
&lt;br /&gt;
==== Anonymous with PIN ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted for anonymous guest users providing a password / PIN code&lt;br /&gt;
* When accessing the share link, the client is redirected to the login screen of the webinterface, using &amp;lt;code&amp;gt;login_type=anonymous&amp;lt;/code&amp;gt;&lt;br /&gt;
* User can then enter his PIN code, client executes the &amp;lt;code&amp;gt;anonymous_login&amp;lt;/code&amp;gt; method, server authenticates, sends back a login response containing the target in the app suite webinterface (module/folder/item)&lt;br /&gt;
* Password can't be changed by an anonymous user&lt;br /&gt;
* Password can be re-constructed / changed by sharing user&lt;br /&gt;
&lt;br /&gt;
==== Guest without Password ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted without providing additional authentication information, the knowledge of the guest's individual link is sufficient&lt;br /&gt;
* When accessing the share link, a guest session is spawned implicitly&lt;br /&gt;
* Exiting cookies are considered to recycle an existing session&lt;br /&gt;
* The login screen is skipped, we'll redirect to the module/folder/item directly (using appropriate URL fragments)&lt;br /&gt;
* Guest user may choose an individual password at a later stage&lt;br /&gt;
&lt;br /&gt;
==== Guest with Password ====&lt;br /&gt;
&lt;br /&gt;
* Access is granted for guest users providing a user name and password.&lt;br /&gt;
* Much similar to a regular groupware user&lt;br /&gt;
* When accessing the share link, the client is redirected to the login screen of the webinterface, using &amp;lt;code&amp;gt;login_type=guest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;login_name=&amp;amp;lt;NAME&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* The login name is used to pre-fill the username input&lt;br /&gt;
* User can then enter his password, client executes the &amp;lt;code&amp;gt;guest_login&amp;lt;/code&amp;gt; method, server authenticates, sends back a login response containing the target in the app suite webinterface (module/folder/item)&lt;br /&gt;
* Password can be changed by guest user&lt;br /&gt;
* Guest user may reset his password if he can't remember&lt;br /&gt;
&lt;br /&gt;
=== Guest Hostname ===&lt;br /&gt;
&lt;br /&gt;
For serving shares, a separate guest hostname needs to be configured. This is mainly required to prevent guest- and regular user sessions using the same cookie container when logged in in the same client (otherwise, the cookie holding the alternative session identifier as well as other cookies would get overwritten concurrently). Additionally, this allows to have separate entry points to the web client for guest- and regular users. &lt;br /&gt;
&lt;br /&gt;
The hostname for guests is used when generating external share links, as well as at other locations where hyperlinks are constructed in the context of guest users. Usually, the guest hostname refers to a separate subdomain of the installation like &amp;lt;code&amp;gt;share.example.com&amp;lt;/code&amp;gt;, and is defined as an additional named virtual host pointing to the web client's document root in the webserver's configuration. &lt;br /&gt;
&lt;br /&gt;
Once the webserver configuration is done and the web client is accessible using the guest hostname, this hostname needs to be specified in the backend configuration, too. In simple scenarios, where a fixed guest hostname should be used for the installation, this can be done statically in a configuration file. This setting may also be overridden per context via the Config Cascade. In case a dedicated hostname service is installed (for example &amp;lt;code&amp;gt;open-xchange-hostname-ldap&amp;lt;/code&amp;gt;), this hostname service is also supposed to supply the guest hostname. &lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The guest hostname may be specified via &amp;lt;code&amp;gt;com.openexchange.share.guestHostname&amp;lt;/code&amp;gt;, either globally in the configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;, or on a more fine-granular level through the [https://oxpedia.org/wiki/index.php?title=ConfigCascade Config Cascade]&lt;br /&gt;
* The guest hostname may also be supplied via dedicated hostname services like &amp;lt;code&amp;gt;open-xchange-hostname-config-cascade&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;open-xchange-hostname-ldap&amp;lt;/code&amp;gt;&lt;br /&gt;
* For test purposes, guests may also access the web interface using the same host as regular users do, however, this might lead to unexpected results (missing images, sessions timing out, auto-login malfunction...)&lt;br /&gt;
&lt;br /&gt;
=== Cookies ===&lt;br /&gt;
&lt;br /&gt;
Guest sessions basically make use of the same cookies as regular user sessions do. This includes the JSESSONID cookie for the JVM route, as well as the &amp;lt;code&amp;gt;open-xchange-secret-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-public-session-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; cookies. Additionally, if configured, the client may also issue a &amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt; request to persist the open-xchange-session-&amp;lt;hash&amp;gt; cookie. This cookie may then be used to auto-login the guest client into the previously used session if it is still valid.&lt;br /&gt;
&lt;br /&gt;
Besides the common cookies, another special cookie is set: &amp;lt;code&amp;gt;open-xchange-share-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt;. The value contains the unique share token bound to the guest user accessing the share. here, the cookie hash is calculated as it's done for ordinary sessions, so that there can only be one &amp;lt;code&amp;gt;open-xchange-share-&amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; cookie in a client at the same time. Whenever an auto-login request is issued by the client, the server checks for the existence of this &amp;amp;quot;share&amp;amp;quot; cookie, and, once recognized and checked for validity, it will try to perform the auto-login for an existing guest session first, i.e. using the session cookie based on the special guest hash calculation outlined above. Otherwise, the common auto-login process takes place. The &amp;amp;quot;share&amp;amp;quot; cookie is removed once the guest session terminates, i.e. the guest user logs out.&lt;br /&gt;
&lt;br /&gt;
Since guest users access the web interface on a separate (sub)domain (see [[#Guest_Hostname|Guest Hostname]] above for details), guest session cookies won't interfere with cookies of a regular session on the same client. This allows to use the regular user session as well as one or more guest sessions in parallel - e.g. if the sharing user quickly wants to check how the contents appear for the guest user after generating a share link.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Whether guest sessions are enabled for auto-login is configurable via the property &amp;lt;code&amp;gt;com.openexchange.share.autoLogin&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* By default, the cookie TTL for guest sessions is inherited from the TTL for cookies of regular sessions as defined by &amp;lt;code&amp;gt;com.openexchange.cookie.ttl&amp;lt;/code&amp;gt; - this default may be overridden by defining a timespan at &amp;lt;code&amp;gt;com.openexchange.share.cookieTTL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Login Modes ===&lt;br /&gt;
&lt;br /&gt;
When accessing a share link, one of the following login modes is triggered to acquire a session and forward the client to the share target. The executed login operation and redirect depends on the authentication mode of underlying guest account, the share target iteself, and the client accessing the share.&lt;br /&gt;
&lt;br /&gt;
==== Redirect to Target ====&lt;br /&gt;
&lt;br /&gt;
In case a share is accessible without providing credentials, the client is redirected to the share target directly, i.e. without prompting for a username or password. By default, the client is redirected to the target in the App Suite web interface by responding the &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; request to the share link with &amp;lt;code&amp;gt;HTTP 302&amp;lt;/code&amp;gt;, and a location header like the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;session=80c711019d6f48b5bec9cd82758e3308&amp;amp;amp;store=true&amp;amp;amp;user=&amp;amp;amp;user_id=642&amp;amp;amp;context_id=1&amp;amp;amp;m=files&amp;amp;amp;f=41042&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The session for the guest user is created implicitly in the backend after checking the share link's validity, and the client is instructed to store appropriate cookies in the redirect response, including the &amp;amp;quot;share&amp;amp;quot; cookie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-secret-aNobP2G9wLHJ6sMr7vtTA=38ee770d6e4f42ab8366d91db3279931; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-public-session-d0759656127fb7cee6e0fe8bb5fe19f9=cae6a3e712ac429e9da9194abd389cb3; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-share-b7gDSqJpnh9gS3Fs52I65Q=0ad50ac00418fbcdad50ac1418f94fb181d51b8fa7b2bde3; Expires=Thu, 13-Aug-2015 06:16:26 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirect to Login Screen ====&lt;br /&gt;
&lt;br /&gt;
If additional credentials, i.e. an additional PIN code or username/password combination, are required to access a share target, and no &amp;amp;quot;special client&amp;amp;quot; like an iCal consumer is detected by the backend, the client is redirected to the login screen of the app suite webinterface. The GET request to the share link is answered with statuscode HTTP 302, and a location header depending on the required credentials to access the share.&lt;br /&gt;
&lt;br /&gt;
If the share ought to be accessed anonymously, but protected by a PIN code, a location like the following is added to the response header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;share=08b4b6110151f1bd7d4b610151f0405d9fc8bb89a887f04e&amp;amp;amp;login_type=anonymous&amp;amp;amp;message_type=INFO&amp;amp;amp;message=Tony%20Parker%20has%20shared%20the%20folder%20%22Pictures%22%20with%20you.%20Please%20log%20in%20to%20view%20it.%20&amp;amp;amp;target=151ebb38&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For shares to dedicated guest users identified by their e-mail address, the redirect location looks like follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Location: /appsuite/ui#!&amp;amp;amp;share=4ac9eb590f9ca4d2ac9eb58f9ca611ec9b4f4638d288c8c0&amp;amp;amp;login_type=guest&amp;amp;amp;message_type=INFO&amp;amp;amp;message=Tony%20Parker%20has%20shared%20the%20file%20%22Agenda.pdf%22%20with%20you.%20Please%20log%20in%20to%20view%20it.%20&amp;amp;amp;login_name=ray%40example.com&amp;amp;amp;target=4444cbc7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The redirect response already contains the &amp;lt;code&amp;gt;Set-Cookie&amp;lt;/code&amp;gt; header for the JVM route. On the redirect target, the client should request the PIN code or password from the user, and then issue a special login request, supplying the share token and optional target from the URL parameters, and the password as URL encoded form data in the request body, similar to the usual login request via POST. After successful authentication, the login response includes, along with the common login response properties like the session identifier, information about the share target being accessed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;amp;quot;session&amp;amp;quot;:&amp;amp;quot;b89af2c2ce494ce4b4573c0632b48e89&amp;amp;quot;,&amp;amp;quot;user&amp;amp;quot;:&amp;amp;quot;ray@example.com&amp;amp;quot;,&amp;amp;quot;user_id&amp;amp;quot;:660,&amp;amp;quot;context_id&amp;amp;quot;:1,&amp;amp;quot;locale&amp;amp;quot;:&amp;amp;quot;en_US&amp;amp;quot;,&amp;amp;quot;module&amp;amp;quot;:&amp;amp;quot;files&amp;amp;quot;,&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;10&amp;amp;quot;,&amp;amp;quot;item&amp;amp;quot;:&amp;amp;quot;10/456398&amp;amp;quot;, ... }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the client is instructed to store the secret cookies:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-share-b7gDSqJpnh9gS3Fs52I65Q=0ac9eb590f9ca4d5ac9eb58f9ca641ec9b4f4638d288c8a0; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-secret-MBIRg9bJBLduCcosqQBCw=70187de16f844be6880c18be373b953d; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Set-Cookie: open-xchange-public-session-d0759656127fb7cee6e0fe8bb5fe19f9=4e797a59758a4dd7b763912472ccf26d; Expires=Thu, 13-Aug-2015 06:31:21 GMT; Path=/; Secure; HttpOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afterwards, the client is able to use the session to access the share target as usual.&lt;br /&gt;
&lt;br /&gt;
=== Session Lifecycle ===&lt;br /&gt;
&lt;br /&gt;
Generally, guest sessions on the server are treated just like the sessions of ordinary users. Especially, guest sessions are also held in the local session containers of the backend host they're associated with. However, by default guest sessions are marked as &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt;, i.e. they are not moved to the long-term session containers, nor they are put into the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* Guest sessions are also accounted in the monitoring outputs (e.g. in the sessions per container graphs)&lt;br /&gt;
* The &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt; handling of guest sessions may be changed via the property &amp;lt;code&amp;gt;com.openexchange.share.transientSessions&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logout ===&lt;br /&gt;
&lt;br /&gt;
Guest sessions are terminated once a logout request is issued by the client, i.e. the user clicks the &amp;amp;quot;Logout&amp;amp;quot; button in the web interface, just like it is done for regular sessions. Additionally, guest sessions expire in the backend when not being used for a while, the actual timeout depends on the configured default session lifetime and whether they are treated as &amp;amp;quot;transient&amp;amp;quot; or not, as explained above.&lt;br /&gt;
&lt;br /&gt;
Since guest users are not able to use the default login page for regular users, a custom logout location for guest users should be specified where guest users are taken to after clicking logout explicitly, or if their session expired.&lt;br /&gt;
&lt;br /&gt;
If a share is consumed &amp;amp;quot;directly&amp;amp;quot;, e.g. by downloading the binary contents of a file share directly (see [[#Consuming_Shares|Consuming Shares]] for details), the guest sessions is terminated instantly after serving the request.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The logout location for guest accounts can be customized via &amp;lt;code&amp;gt;guestLogoutLocation&amp;lt;/code&amp;gt; in the file &amp;lt;code&amp;gt;as-config.yml&amp;lt;/code&amp;gt; (see file &amp;lt;code&amp;gt;as-config-default.yml&amp;lt;/code&amp;gt; for an example)&lt;br /&gt;
&lt;br /&gt;
== Share Notifications ==&lt;br /&gt;
&lt;br /&gt;
With the new sharing concept, notification mails can be sent out to the permission entities (i.e. internal or guest users) of folders or items. Mechanisms exist to send out such mails implicitly or explicitly. Notifications are sent out implicitly, if externals are invited as guests and can also be sent out for internal invitations, if configured so. The client (e.g. App Suite UI) decides on its own whether implicit notifications shall be sent when updating a folders or items permissions. Besides there are separate API calls for sending out notification messages explicitly. Its on the client to provide this functionality to its users. This makes it possible to re-send a link to a folder or item to an existing permission entity.&lt;br /&gt;
&lt;br /&gt;
Sending out links to shared folders and items is not the only case for notification messages, it can also be necessary to send out system notifications to guest users. Currently this is the case when a guest user secured his account with a password and needs to reset that password, because he cannot remember.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* A special transport must be configured for system notifications and cases where the sharing user has no configured webmail account. This transport is configured in &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt;. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
* It is possible to disable the implicit notification of internal users about shared folders or items at all by setting &amp;lt;code&amp;gt;com.openexchange.share.notifyInternal&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The layout of notifications mails can be changed via &amp;lt;code&amp;gt;as-config.yml&amp;lt;/code&amp;gt;. All available properties are defined and explained in &amp;lt;code&amp;gt;as-config-defaults.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API Access ==&lt;br /&gt;
&lt;br /&gt;
From a client's point of view, guest users basically don't differ from regular users, although they usually have limited capabilities, for example no mail access or no personal folders. However, all those differences are reflected within the regular permission- and capability-concepts, so that existing clients, once the guest user is authenticated and has a valid session, continue to work transparently, and use the same API calls as with a regular groupware user.&lt;br /&gt;
&lt;br /&gt;
To create or manage shares and guest users, the HTTP API has been extended at various locations. The following list gives an overview about the changes, derived from the corresponding software change requests.&lt;br /&gt;
&lt;br /&gt;
=== Format change for object identifiers of the default &amp;amp;quot;infostore&amp;amp;quot; account ===&lt;br /&gt;
&lt;br /&gt;
As preparation for individual object permissions where a file can be accessed from different folder &amp;amp;quot;views&amp;amp;quot;, the object IDs for documents in the default &amp;amp;quot;infostore&amp;amp;quot; file storage account will get enhanced with the prefixing folder ID.&lt;br /&gt;
&lt;br /&gt;
The identifiers will now be of format &amp;lt;code&amp;gt;&amp;amp;lt;some numbers&amp;amp;gt;/&amp;amp;lt;more numbers&amp;amp;gt;&amp;lt;/code&amp;gt;. Object identifiers are already of type &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, so this change should usually be transparent to clients. However, there may be some clever clients out there that for example tried to interpret the string of numerical characters as number, so client developers should double-check their implementation for compatibility. They most likely would run into trouble when coping with non-infostore file storages anyway.&lt;br /&gt;
&lt;br /&gt;
=== Object permissions for files ===&lt;br /&gt;
&lt;br /&gt;
In order to define permissions on object-level, a new property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; for objects of type &amp;lt;code&amp;gt;infoitem&amp;lt;/code&amp;gt; is introduced. Each time the underlying folder permissions are not sufficient to access an item, those object permissions are taken into account. Object permissions are stored as an array of Object Permission objects as defined below within the detailed infoitem data, the column ID is &amp;lt;code&amp;gt;108&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Details about the JSON structure are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedInfoitemData HTTP API: Detailed Infoitem Data]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionObject HTTP API: Object Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionFlags HTTP API: Object Permission Flags]&lt;br /&gt;
&lt;br /&gt;
=== New field for &amp;amp;quot;user&amp;amp;quot; data: &amp;amp;quot;guest_created_by&amp;amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
A new property has been introduced for users that needs to be exposed in our HTTP API, too. The following property is added to the detailed user data object:&lt;br /&gt;
&lt;br /&gt;
* ID: 616&lt;br /&gt;
* Name: guest_created_by&lt;br /&gt;
* Type: Number&lt;br /&gt;
* Value: Contains the ID of the user who has created this guest in case this user represents a guest user; it is 0 for regular users&lt;br /&gt;
&lt;br /&gt;
The property is read-only and can't be removed or set by clients.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedUserData HTTP API: Detailed User Data]&lt;br /&gt;
&lt;br /&gt;
=== Extend folder- and object permissions for addressing external guests ===&lt;br /&gt;
&lt;br /&gt;
For sharing files- or folders to external guests, the folder- and object permission objects are extended with additional properties. Those extended properties can be set during creation or update of the parent folder or file. The underlying shares and guest user entities for the referenced recipients are created automatically along with folder/file creation/update. Afterwards, the external recipients appear as regular &amp;amp;quot;user&amp;amp;quot; entities in the permission arrays in subsequent &amp;amp;quot;get&amp;amp;quot; requests.&lt;br /&gt;
&lt;br /&gt;
Details about the extended JSON structure are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#PermissionObject HTTP API: Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ObjectPermissionObject HTTP API: Object Permission Object]&lt;br /&gt;
&lt;br /&gt;
=== New Ajax module: share/management ===&lt;br /&gt;
&lt;br /&gt;
To work with shares, a new Ajax module is introduced.&lt;br /&gt;
&lt;br /&gt;
The available actions in the module are described at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Module_.22share.2Fmanagement.22_.28preliminary.2C_available_with_v7.8.0.29 HTTP API: Module share management]&lt;br /&gt;
&lt;br /&gt;
=== New column &amp;amp;quot;shareable&amp;amp;quot; in detailed infoitem data ===&lt;br /&gt;
&lt;br /&gt;
Clients want to know quickly if an infostore item is shareable or not. A new (read-only) property named &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt; of type Boolean with column identifier &amp;lt;code&amp;gt;109&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;detailed infoitem data&amp;amp;quot;. If &amp;amp;quot;true&amp;amp;quot;, the can be considered as shareable, i.e. the item's object permissions may be adjusted by the user.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#DetailedInfoitemData HTTP API: Detailed Infoitem Data]&lt;br /&gt;
&lt;br /&gt;
=== New action &amp;amp;quot;shares&amp;amp;quot; in module folder ===&lt;br /&gt;
&lt;br /&gt;
To provide an overview of all folders of a certain modules that are shared to others, a new &amp;lt;code&amp;gt;shares&amp;lt;/code&amp;gt; action is added to the Ajax module &amp;lt;code&amp;gt;folders&amp;lt;/code&amp;gt;. It returns all personal folders of a certain module that are shared to other entities.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Get_shared_folders_.28Since_7.8.0.2C_Preliminary.29 HTTP API: Get shared folders]&lt;br /&gt;
&lt;br /&gt;
=== New action &amp;amp;quot;shares&amp;amp;quot; in module infostore ===&lt;br /&gt;
&lt;br /&gt;
To provide an overview of all files that are shared to others, a new &amp;lt;code&amp;gt;shares&amp;lt;/code&amp;gt; action is added to the Ajax module &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt;. It returns all personal files that are shared to other entities.&lt;br /&gt;
&lt;br /&gt;
Further details are available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#Get_shared_infoitems_.28Since_7.8.0.2C_Preliminary.29 HTTP API: Get shared infoitems]&lt;br /&gt;
&lt;br /&gt;
=== New fields to retrieve extended permissions of files and folders ===&lt;br /&gt;
&lt;br /&gt;
Clients would like to have more details about permission entities folders directly. A new read-only property named &amp;lt;code&amp;gt;com.openexchange.share.extendedPermissions&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;Detailed folder data&amp;amp;quot;, with column identifier &amp;lt;code&amp;gt;3060&amp;lt;/code&amp;gt;. It basically contains the same as the regular &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; array, yet enhanced by resolved information about the user, group or guest entities as well as additional, sharing-related properties.&lt;br /&gt;
&lt;br /&gt;
Similarly, a new read-only property named &amp;lt;code&amp;gt;com.openexchange.share.extendedObjectPermissions&amp;lt;/code&amp;gt; is introduced for &amp;amp;quot;Detailed infoitem data&amp;amp;quot;, with column identifier &amp;lt;code&amp;gt;7010&amp;lt;/code&amp;gt;. It basically contains the same as the regular &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; array, yet enhanced by resolved information about the user, group or guest entities as well as additional, sharing-related properties.&lt;br /&gt;
&lt;br /&gt;
Further information about the JSON structure is available at:&lt;br /&gt;
&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ExtendedPermissionObject HTTP API: Extended Permission Object]&lt;br /&gt;
* [http://oxpedia.org/index.php?title=HTTP_API#ExtendedObjectPermissionObject HTTP API: Extended Object Permission Object]&lt;br /&gt;
&lt;br /&gt;
== Consuming Shares ==&lt;br /&gt;
&lt;br /&gt;
Depending on the shared contents and the requesting user agent, shares may be consumed in a couple of different ways. The concrete response to a request to the share URL is evaluated by the share servlet in the backend.&lt;br /&gt;
&lt;br /&gt;
=== App Suite ===&lt;br /&gt;
&lt;br /&gt;
The default handling for all shares is forwarding them to the App Suite web interface, where the shared contents are made available through the existing client. Based on the underlying guest account, the client is either forwarded to the login prompt, or taken directly to the share target if no credentials need to be provided. This process is described in more detail at [[#Guest_Login_&amp;amp;_Session_Handling|Guest Login &amp;amp;amp; Session Handling]].&lt;br /&gt;
&lt;br /&gt;
=== Direct Download ===&lt;br /&gt;
&lt;br /&gt;
Shares to a single file may also be downloaded directly by clients, without opening them in the web interface first. This is indicated by an additional parameter appended to the plain share link, and can be specified in the following ways:&lt;br /&gt;
&lt;br /&gt;
* Append &amp;lt;code&amp;gt;dl&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?dl=true&amp;lt;/code&amp;gt;&lt;br /&gt;
* Specify &amp;lt;code&amp;gt;delivery&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?delivery=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If accessing the item requires authentication, an unauthenticated request is responded with &amp;lt;code&amp;gt;HTTP 401 Unauthorized&amp;lt;/code&amp;gt;. The client then has to provide the correct credentials to access the share via basic authentication. If there's no dedicated username for the underlying guest account - i.e. an &amp;amp;quot;anonymous&amp;amp;quot; share link protected with a PIN code is accessed - only the password is checked, i.e. the client may then supply an arbitrary username in the basic authentication header like &amp;amp;quot;Guest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get iCal ===&lt;br /&gt;
&lt;br /&gt;
Shares to a single calendar- or task-folder may also be downloaded directly by clients as iCal files, without opening them in the web interface first. This standard format allows to consume event data directly using various calendaring clients, which often can be configured to subscribe an external calendar source.&lt;br /&gt;
&lt;br /&gt;
Once a share link to a calendar- or task-folder is requested by the client, the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt;- and &amp;lt;code&amp;gt;User-Agent&amp;lt;/code&amp;gt; headers of the request are evaluated. If the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; header is either set to &amp;lt;code&amp;gt;text/calendar&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text/iCal&amp;lt;/code&amp;gt;, or if the &amp;lt;code&amp;gt;User-Agent&amp;lt;/code&amp;gt; header denotes a well-known client like Microsoft Outlook or Mozilla Thunderbird w/ Lightning, the contents of the shared folder are converted to an iCal file that is directly written back in the response.&lt;br /&gt;
&lt;br /&gt;
To force the iCal output, an additional parameter may be appended to the plain share link:&lt;br /&gt;
&lt;br /&gt;
* Append &amp;lt;code&amp;gt;ical&amp;lt;/code&amp;gt; parameter:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;https://ox.example.com/ajax/share/48b2b6190151f1bd8b4b610151f0405d9fc8cb89a087f14e/151eab38?ical=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If accessing the item requires authentication, an unauthenticated request is responded with &amp;lt;code&amp;gt;HTTP 401 Unauthorized&amp;lt;/code&amp;gt;. The client then has to provide the correct credentials to access the share via basic authentication. If there's no dedicated username for the underlying guest account - i.e. an &amp;amp;quot;anonymous&amp;amp;quot; share link protected with a PIN code is accessed - only the password is checked, i.e. the client may then supply an arbitrary username in the basic authentication header like &amp;amp;quot;Guest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The interval of task- and appointment data considered for conversion to iCal can be adjusted via &amp;lt;code&amp;gt;com.openexchange.share.handler.iCal.futureInterval&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;com.openexchange.share.handler.iCal.pastInterval&amp;lt;/code&amp;gt; in configuration file &amp;lt;code&amp;gt;share.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cross-context functionality ==&lt;br /&gt;
&lt;br /&gt;
As already mentioned in previous sections the administrator is able to configure if guests should be handled per context (default) or server wide by using the configuration parameter &amp;lt;code&amp;gt;com.openexchange.share.crossContextGuests&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the guests email address is used to recognize if there is already a registered user with the given address and aligns the stored password to the already existing guest user. In addition to the password (which is the most important parameter this feature is about) even the users contact data gets synchronized.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* To handle user and contact data across contexts boundaries the feature has to be enabled before a guest receives the first share. Guests that receive shares before the activation cannot be considered within the alignment process. Only latter shares will be considered.&lt;br /&gt;
* At the moment this feature does only sync user and contact related data (no shared content). If the user got two shares from different contexts he will only see shares related to the given link.&lt;br /&gt;
&lt;br /&gt;
== Publish/Subscribe vs. Sharing ==&lt;br /&gt;
&lt;br /&gt;
The upcoming sharing features are going to replace the previously used OXMF &amp;amp;quot;publications&amp;amp;quot;, allowing guest users to interact with the shared data in the same way as regular groupware users do. However, since the underlying concepts and their technical realization are completely different, a seamless migration between publications and shares is not possible without some drawbacks.&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview of the main discrepancies:&lt;br /&gt;
&lt;br /&gt;
* Custom templates for OXMF publication targets&amp;lt;br /&amp;gt;An adminsitrator/admin may have defined some custom publication targets that are using the published data in a special way. While shares would still make all the data available (mainly via the web interface), this would only be a drop-in replacement for the ordinary &amp;amp;quot;view the publication in a browser&amp;amp;quot; use case, but not for anything beyond that scope.&lt;br /&gt;
* Subscribe of publications&amp;lt;br /&amp;gt;Publications from one user can be added to another user's groupware using the &amp;amp;quot;subscribe&amp;amp;quot; functionality, making use of the embedded microformat data of publications (OXMF). For sharing, we will not have a similar feature in the first iteration, so migrating an existing publication to a share would also stop it from being subscribable.&lt;br /&gt;
* Deep links to download files of publications&amp;lt;br /&amp;gt;Files behind an infostore publication were accessible behind a static URL, which would theoretically allow them to be requested independently of the parent publication (e.g. images linked from an external website). While the entry URL to a publication would be mappable to a corresponding share URL, converting existing publications to shares would at least break such deep links.&lt;br /&gt;
&lt;br /&gt;
Because of the above points and the whole different concept, we do not migrate existing publications to shares. Instead, the default behavior will be:&lt;br /&gt;
&lt;br /&gt;
* No new OXMF publications or subscriptions can be created by default&lt;br /&gt;
* The web client does no longer give the option to publish or subscribe in the OXMF format&lt;br /&gt;
* Existing OXMF publications / subscriptions can't be updated&lt;br /&gt;
* Existing OXMF publications continue to work as is, including associated subscriptions&lt;br /&gt;
* Yet it's still possible to delete existing publications and subscriptions&lt;br /&gt;
* Therefore, the menu section &amp;amp;quot;Publications and Subscriptions&amp;amp;quot; will still be available (if there's at least one publication or subscription)&lt;br /&gt;
&lt;br /&gt;
Exceptions to these rules cover special internal subscriptions to 3rd party services like addressbooks from LinkedIn or Xing, as well as the auto-publish feature of mail attachments exceeding a specific size.&lt;br /&gt;
&lt;br /&gt;
'''''Administrator Notes:'''''&lt;br /&gt;
&lt;br /&gt;
* The possibility to create/update OXMF publications via HTTP-API may be configured via &amp;lt;code&amp;gt;com.openexchange.publish.createModifyEnabled&amp;lt;/code&amp;gt; in file &amp;lt;code&amp;gt;publications.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* The possibility to create/update OXMF subscriptions via HTTP-API may be configured via &amp;lt;code&amp;gt;com.openexchange.subscribe.microformats.createModifyEnabled&amp;lt;/code&amp;gt; in file &amp;lt;code&amp;gt;microformatSubscription.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;br /&gt;
[[Category: Administrator]]&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21364</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21364"/>
		<updated>2016-01-28T09:38:35Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#File_Metadata]]. If available, the requested metadata of files is included in the corresponsing &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|-&lt;br /&gt;
| localizedFolderNames || Object || A JSON object mapping the (relative) paths of directories to their localized name (based on the supplied &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or the user's locale). Available with v7.8.1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/appsuite/help-drive/l10n/de_DE/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;http://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.8.1-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;4&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;localizedFolderNames&amp;quot;: {&lt;br /&gt;
           &amp;quot;/Documents&amp;quot;: &amp;quot;Dokumente&amp;quot;,&lt;br /&gt;
           &amp;quot;/Music&amp;quot;: &amp;quot;Musik&amp;quot;,&lt;br /&gt;
           &amp;quot;/Pictures&amp;quot;: &amp;quot;Bilder&amp;quot;,&lt;br /&gt;
           &amp;quot;/&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
           &amp;quot;/Documents/Templates&amp;quot;: &amp;quot;Vorlagen&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.5353 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#File_Metadata|FileMetadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot;: 1418024049629,&lt;br /&gt;
   &amp;quot;modified&amp;quot;: 1418024189166,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this folder.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this folder.&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21361</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=21361"/>
		<updated>2016-01-27T10:37:58Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#File_Metadata]]. If available, the requested metadata of files is included in the corresponsing &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/ajax/help/en_US/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;https://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.4.2-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;2&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.5353 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#File_Metadata|FileMetadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed. To notify without a custom message, an empty &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; object should still be added.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot;: 1418024049629,&lt;br /&gt;
   &amp;quot;modified&amp;quot;: 1418024189166,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this folder.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this folder.&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21246</id>
		<title>HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21246"/>
		<updated>2016-01-12T13:40:26Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This document defines the Open-Xchange HTTP API which is used by the new AJAX GUI. The first chapter describes general definitions and conventions which apply to all server modules. All other chapters describe individual server modules.&lt;br /&gt;
&lt;br /&gt;
=== Low level protocol ===&lt;br /&gt;
&lt;br /&gt;
The client accesses the server through HTTP GET, POST and PUT requests. HTTP cookies are used for authentication and must therefore be processed and sent back by the client as specified by [http://tools.ietf.org/html/rfc6265 RFC 6265]. The HTTP API is accessible at URIs starting with &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;. Each server module has a unique name and its own sub-namespace with that name below &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;, e. g. all access to the module &amp;quot;tasks&amp;quot; is via URIs starting with &amp;lt;code&amp;gt;/ajax/tasks&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Text encoding is always UTF-8. Data is sent from the server to the client as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; and interpreted by the client to obtain an ECMAScript object. The HTTP API uses only a small subset of the ECMAScript syntax. This subset is roughly described by the following BNF:&lt;br /&gt;
&lt;br /&gt;
 Value   ::= &amp;quot;null&amp;quot; | Boolean | Number | String | Array | Object&lt;br /&gt;
 Boolean ::= &amp;quot;true&amp;quot; | &amp;quot;false&amp;quot;&lt;br /&gt;
 Number  ::= see NumericLiteral in ECMA 262 3rd edition&lt;br /&gt;
 String  ::= \&amp;quot;([^&amp;quot;\n\\]|\\[&amp;quot;\n\\])*\&amp;quot;&lt;br /&gt;
 Array   ::= &amp;quot;[]&amp;quot; | &amp;quot;[&amp;quot; Value (&amp;quot;,&amp;quot; Value)* &amp;quot;]&amp;quot;&lt;br /&gt;
 Object  ::= &amp;quot;{}&amp;quot; | &amp;quot;{&amp;quot; Name &amp;quot;:&amp;quot; Value (&amp;quot;,&amp;quot; Name &amp;quot;:&amp;quot; Value)* &amp;quot;}&amp;quot;&lt;br /&gt;
 Name    ::= [A-Fa-f][0-9A-Fa-f_]*&lt;br /&gt;
&lt;br /&gt;
Numbers are the standard signed integer and floating point numbers. Strings can contain any character, except double quotes, newlines and backslashes, which must be escaped by a backslash. Control characters in strings (other than newline) are not supported. Whitespace is allowed between any two tokens. See [http://json.org JSON] and [http://www.ecma-international.org/publications/standards/Ecma-262.htm ECMA 262, 3&amp;lt;sup&amp;gt;rd&amp;lt;/sup&amp;gt; edition] for the formal definition.&lt;br /&gt;
&lt;br /&gt;
The response body consists of an object, which contains up to four fields as described in [[#ResponseBody | Response body]]. The field &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; contains the actual payload which is described in following chapters. The fields &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;error_params&amp;lt;/code&amp;gt; are present when data objects are returned, if an error occurred and if the error message contains conversion specifiers, respectively. Following sections describe the contents of these fields in more detail.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResponseBody&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Response body&lt;br /&gt;
! Name         !! Type      !! Value&lt;br /&gt;
|-&lt;br /&gt;
| data         || Value     || Payload of the response.&lt;br /&gt;
|-&lt;br /&gt;
| timestamp    || Timestamp || The latest timestamp of the returned data (see [[HTTP_API#Updates|Updates]]).&lt;br /&gt;
|-&lt;br /&gt;
| error        || String    || The translated error message. Present in case of errors.&lt;br /&gt;
|-&lt;br /&gt;
| error_params || Array     || As o 7.4.2: Empty JSON array. Before that: Parameters for the error message that would need to be replaced in the error string (in a printf-format style).&lt;br /&gt;
|-&lt;br /&gt;
| error_id     || String    || Unique error identifier to help finding this error instance in the server logs.&lt;br /&gt;
|-&lt;br /&gt;
| error_desc     || String    || The technical error message (always English) useful for debugging the problem. Might be the same as error message if there is no more information available&lt;br /&gt;
|-&lt;br /&gt;
| code         || String    || Error code consisting of an upper-case module identifier and a four-digit message number, separated by a dash; e.g. &amp;quot;MSG-0012&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| error_stack     || Array    || If configured (see &amp;quot;com.openexchange.ajax.response.includeStackTraceOnError&amp;quot; in 'server.properties') this field provides the stack trace of associated Java exception represented as a JSON array&lt;br /&gt;
|-&lt;br /&gt;
| categories     || String OR Array    || Either a single (String) or list (Array) of upper-case category identifiers to which the error belongs. E.g.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| &amp;quot;USER_INPUT&amp;quot;  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFIGURATION&amp;quot;  || An error related to user/system configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;PERMISSION_DENIED&amp;quot;  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRY_AGAIN&amp;quot;  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;SERVICE_DOWN&amp;quot;  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONNECTIVITY&amp;quot;  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;ERROR&amp;quot;  || A programming error which was caused by incorrect program code.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFLICT&amp;quot;  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CAPACITY&amp;quot; || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRUNCATED&amp;quot; || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;WARNING&amp;quot; || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| category     || Number    || Maintained for legacy reasons: The numeric representation of the first category:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| 2  || An error strictly related to user configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| 3  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| 5  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| 6  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| 8  || A programming error which was caused by incorrect programm code.&lt;br /&gt;
|-&lt;br /&gt;
| 9  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| 12 || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Data from the client to the server can be sent in several formats. Small amounts of data are sent as &amp;lt;code&amp;gt;application/x-www-urlencoded&amp;lt;/code&amp;gt; in query parameters in the request URI. For POST requests, some or all parameters may be sent in the request body instead of in the URI using any valid encoding for POST requests. Alternatively, some requests specify that data is sent as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; in the body of a PUT request. The format of the request body for PUT requests is the same as for sending data from the server to the client, except that the payload is sent directly, without being wrapped in another object.&lt;br /&gt;
&lt;br /&gt;
When updating existing data, the client sends only fields that were modified. To explicitly delete a field, the field is sent with the value &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. For fields of type &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, the empty string &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Error handling ===&lt;br /&gt;
&lt;br /&gt;
If the session of the user times out, if the client doesn't send a session ID or if the session for the specified session ID can not be found then the server returns the above described response object, that contains an error code and an error message. If the request URI or the request body is malformed or incomplete then the server returns the reponse object with an error message, too. In case of internal server errors, especially Java exceptions, or if the server is down, it returns the HTTP status code 503, Service Unavailable. Other severe errors may return other HTTP status values.&lt;br /&gt;
&lt;br /&gt;
Application errors, which can be caused by a user and are therefore expected during the operation of the groupware, are reported by setting the field error in the returned object, as described in [[#ResponseBody | Response body]]. Since the error messages are translated by the client, they can not be composed of multiple variable parts. Instead, the error message can contain simplified printf()-style conversion specifications, which are replaced by elements from the array in the field error_params. If error_params is not present, no replacement occurs, even if parts of the error message match the syntax of a conversion specification.&lt;br /&gt;
&lt;br /&gt;
A simplified conversion specification, as used for error messages, is either of the form %s or %''n''$s, where ''n'' is a 1-based decimal parameter index. The conversion specifications are replaced from left to right by elements from error_params, starting at the first element. %s is replaced by the current element and the current index is incremented. %''n''$s is replaced by the ''n''th element and the current index is set to the (''n'' + 1)th element.&lt;br /&gt;
&lt;br /&gt;
Some error message contain data sizes which must be expressed in Bytes or Kilobytes etc., depending on the actual value. Since the unit must be translated, this conversion is performed by the client. Unfortunately, standard printf()-style formatting does not have a specifier for this kind of translation. Therefore, the conversion specification for sizes is the same as for normal strings, and the client has to determine which parameters to translate based on the error code. The current error codes and the corresponding size parameters are listed in [[#DataSizeParameters | Data size parameters]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSizeParameters&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data size parameters&lt;br /&gt;
! Error code !! Parameter indices&lt;br /&gt;
|-&lt;br /&gt;
| CON-0101   || 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| FLS-0003   || 1, 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0065   || 1, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0066   || 1&lt;br /&gt;
|-&lt;br /&gt;
| NON-0005   || 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Date and time ===&lt;br /&gt;
&lt;br /&gt;
Dates without time are transmitted as the number of milliseconds between 00:00 UTC on that date and 1970-01-01 00:00 UTC. Leap seconds are ignored, therefore this number is always an integer multiple of 8.64e7.&lt;br /&gt;
&lt;br /&gt;
Because ECMAScript Date objects have no way to explicitly specify a timezone for calculations, timezone correction must be performed on the server. Dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''user's'' timezone and UTC at the time in question. (See the Java method java.util.TimeZone.getOffset(long)). Unless optional URL parameter &amp;lt;code&amp;gt;'''timezone'''&amp;lt;/code&amp;gt; is present. Then dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''specified'' timezone and UTC at the time in question.&lt;br /&gt;
&lt;br /&gt;
For some date and time values, especially timestamps, monotonicity is more important than the actual value. Such values are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC, ignoring leap seconds and without timezone correction. If possible, a unique strictly monotonic increasing value should be used instead, as it avoids some race conditions described below.&lt;br /&gt;
&lt;br /&gt;
This specification refers to these three interpretations of the type Number as separate data types. The types are described in [[#DateAndTimeTypes | Date and time types]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DateAndTimeTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Date and time types&lt;br /&gt;
! Type      !! Time !! Timezone !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| Date      || No   || UTC      || Date without time.&lt;br /&gt;
|-&lt;br /&gt;
| Time      || Yes  || User     || Date and time.&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || Yes  || UTC      || Timestamp or unique sequence number.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
&lt;br /&gt;
To allow efficient synchronization of a client with changes made by other clients and to detect conflicts, the server stores a timestamp of the last modification for each object. Whenever the server transmits data objects to the client, the response object described in [[#ResponseBody | Response body]] includes the field timestamp. This field contains a timestamp value which is computed as the maximum of the timestamps of all transmitted objects.&lt;br /&gt;
&lt;br /&gt;
When requesting updates to a previously retrieved set of objects, the client sends the last timestamp which belongs to that set of objects. The response contains all updates with timestamps greater than the one specified by the client. The field timestamp of the response contains the new maximum timestamp value.&lt;br /&gt;
&lt;br /&gt;
If multiple different objects may have the same timestamp values, then a race condition exists when an update is processed between two such objects being modified. The first, already modified object will be included in the update response and its timestamp will be the maximum timestamp value sent in the timestamp field of the response. If the second object is modified later but gets the same timestamp, the client will never see the update to that object because the next update request from the client supplies the same timestamp value, but only modifications with greater timestamp values are returned.&lt;br /&gt;
&lt;br /&gt;
If unique sequence numbers can't be used as timestamps, then the risk of the race condition can be at least minimized by storing timestamps in the most precise format and/or limiting update results to changes with timestamp values which are measurably smaller than the current timestamp value.&lt;br /&gt;
&lt;br /&gt;
=== Editing ===&lt;br /&gt;
&lt;br /&gt;
Editing objects is performed one object at a time. There may be multiple objects being edited by the same client simulataneously, but this is achieved by repeating the steps required for editing a single object. There is no batch edit or upload command.&lt;br /&gt;
&lt;br /&gt;
To edit an object, a client first requests the entire object from the server. The server response contains the timestamp field described in the previous section. For in-place editing inside a view of multiple objects, where only already retrieved fields can be changed, retrieving the entire object is not necessary, and the last timestamp of the view is used as the timestamp of each object in it.&lt;br /&gt;
&lt;br /&gt;
When sending the modified object back to the server, only modified fields need to be included in the sent object. The request also includes the timestamp of the edited object. The timestamp is used by the server to ensure that the object was not edited by another client in the meantime. If the current timestamp of the object is greater than the timestamp supplied by the client, then a conflict is detected and the field error is set in the response. Otherwise, the object gets a new timestamp and the response to the client is empty.&lt;br /&gt;
&lt;br /&gt;
If the client displays the edited object in a view together with other objects, then the client will need to perform an update of that view immediately after successfully uploading an edited object.&lt;br /&gt;
&lt;br /&gt;
=== File uploads ===&lt;br /&gt;
&lt;br /&gt;
File uploads are made by sending a POST request that submits both the file and the needed fields as parts of a request of content-type “multipart/form-data” or “multipart/mixed”. The file metadata are stored in a form field “file” (much like an &amp;lt;input type=”file” name=”file” /&amp;gt; would do). In general a call that allows file uploads via POST will have a corresponding call using PUT to send object data. The JSON-encoded object-data that is send as the body of a corresponding PUT call is, when performed as a POST with file uploads, put into the request parameter “json”.&lt;br /&gt;
&lt;br /&gt;
Since the upload is performed directly by the browser and is not an Ajax call, the normal callback mechanism for asynchronous Javascript calls cannot be used to obtain the result. For this reason the server responds to these POST calls with a complete HTML page that performs the callback and should not be displayed to the user. The HTML response is functionally equivalent to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
     &amp;lt;head&amp;gt;&lt;br /&gt;
         &amp;lt;META http-equiv=&amp;quot;Content-Type&amp;quot; content=\&amp;quot;text/html; charset=UTF-8\&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
             (parent[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;] || window.opener &amp;amp;&amp;amp; window.opener[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;])&lt;br /&gt;
             (&amp;lt;b&amp;gt;{json}&amp;lt;/b&amp;gt;)&lt;br /&gt;
         &amp;lt;/script&amp;gt;&lt;br /&gt;
     &amp;lt;/head&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The placeholders &amp;lt;code&amp;gt;{json}&amp;lt;/code&amp;gt; is replaced by the response with the timestamp that would be expected from the corresponding PUT method. The placeholder &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; is replaced by the value of the parameter &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; of the request (except for the import bundle, which is named &amp;quot;import&amp;quot; instead of the action name for legacy purposes). The content-type of the answer is &amp;lt;code&amp;gt;text/html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Non-browser clients don't need to interpret HTML or JavaScript. The JSON data can be recognized by the outermost &amp;lt;code&amp;gt;({&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;})&amp;lt;/code&amp;gt;, where the inner braces are part of the JSON value. For example, the regular expression &amp;lt;code&amp;gt;\((\{.*\})\)&amp;lt;/code&amp;gt; captures the entire JSON value in its first capturing group.&lt;br /&gt;
&lt;br /&gt;
=== Documentation conventions ===&lt;br /&gt;
&lt;br /&gt;
The rest of this document describes all available requests for each module. A module usually supports several different requests, which are differentiated by the used HTTP method, URI path and supplied URI parameters. The description of each method generally contains the following elements:&lt;br /&gt;
* the HTTP method followed by the request URI, inclusing the URI parameter action, which is used to differentiate methods,&lt;br /&gt;
* a list of URI parameters which can or must be supplied by the client,&lt;br /&gt;
* for PUT requests, content of the request body,&lt;br /&gt;
* for POST requests all described parameters are normally expected in the request body, exceptions are documented,&lt;br /&gt;
* &amp;quot;Response with timestamp:&amp;quot;if the timestamp field is required in the response body or simply &amp;quot;Response:&amp;quot; if not,&lt;br /&gt;
* content of the response payload, unless it is supposed to be empty.&lt;br /&gt;
&lt;br /&gt;
=== Common object data ===&lt;br /&gt;
&lt;br /&gt;
This table contains common fields which apply for any module's data type and is referenced throughout this document whenever a module's data type is described.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonObjectData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common object data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|-&lt;br /&gt;
| 100  || categories     || String  || String containing comma separated the categories. Order is preserved. Changing the order counts as modification of the object. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 101  || private_flag     || Boolean  || Overrides folder permissions in shared private folders: When true, this object is not visible to anyone except the owner. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 102  || color_label  || Number  || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive). Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 104  || number_of_attachments     || Number  || Number of attachments &lt;br /&gt;
|-&lt;br /&gt;
| 105 || lastModifiedOfNewestAttachmentUTC || Time || Date and time of the newest attachment written with UTC time zone.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;login&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The login module is used to obtain a session from the user's login credentials. To understand the details of the different login methods, see the article titled &amp;quot;[[Login variations]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Because of security reasons each login variation will reject requests containing the parameter &amp;quot;password&amp;quot; within the URL query (starting with 7.8.0).&lt;br /&gt;
&lt;br /&gt;
=== Login ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters are normally expected in the POST request body:&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password MUST be placed in the request body, otherwise the login request will be denied.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; (optional) – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method.&lt;br /&gt;
&lt;br /&gt;
=== Form Login (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=formlogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request implements a possible login to the web frontend by only using a simple HTML form. An example for such a form can be found in the backend's documentation folder (&amp;lt;code&amp;gt;/usr/share/doc/open-xchange-core&amp;lt;/code&amp;gt;) under &amp;lt;code&amp;gt;examples/login.html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client must be the same as the client sent by the UI in the normal login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI. The URL of the web UI is either taken from the given parameter or from the configured default of the backend.&lt;br /&gt;
&lt;br /&gt;
For a complete description of the FormLogin-Process please see [[FormLogin|this documentation]]&lt;br /&gt;
&lt;br /&gt;
=== Token Login (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokenLogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows every possible client to create a very short living session. This session can then be transferred to any other client preferably a browser entering then the normal web interface. Then the sessions life time will be extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Compared to the login mechanism using the random token, this request is more secure because two tokens are used. One of these tokens is only known to the client and one is generated by the server. Only the combination of both tokens allows to use the session. The combination of both tokens must be done by the client creating the session.&lt;br /&gt;
&lt;br /&gt;
DISCLAIMER: This request MUST NOT be used by some server side instance. If some server side instance uses this request to create a session for a browser on some client machine, then you have to transfer the full URL with server and client token over some connection to the client. This creates a VULNERABILITY if this is done. The token login method is only secure if this request is already sent from the same machine that later runs the browser using the created session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login information.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client should be the same as the client sent by the UI in the normal login request. For security considerations it can become necessary to define here the correct client that will use the session.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Version of the HTTP/JSON interface client. Only for statistic evaluations.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail. This must be enabled on the server and a client can test with the autologin request if it is enabled or not.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used. Currently the IP address may change when using the session with both tokens. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used. Currently the User-Agent may change when using the session. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;jsonResponse&amp;lt;/code&amp;gt; (optional, since 7.8.0) – true or false (default). Defines the returned data type as JSON. Default 'false' will return a redirect. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI (or JSON including the redirect url in case jsonResponse=true is set). The URL of the web UI is either taken from the given parameter or from the configured default of the backend. This redirect will only contain the server side token. The client side token sent in the request must be appended by the client creating the session. The final URL must have the form &amp;lt;code style=&amp;quot;white-space: nowrap&amp;quot;&amp;gt;&amp;lt;var&amp;gt;redirect_URL&amp;lt;/var&amp;gt;&amp;amp;amp;clientToken=&amp;lt;var&amp;gt;token&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;. Both tokens are necessary to use the session and both tokens must match. Otherwise the session is terminated.&lt;br /&gt;
&lt;br /&gt;
=== Tokens (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokens&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows clients to access a session created with the [[#Token_Login_.28since_7.0.1.29 | tokenLogin]] request. When accessing the session its life time is extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;serverToken&amp;lt;/code&amp;gt; – Server side identifier for accessing the session. This identifier was created by the server and is contained in the tokenLogin response.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. This identifier was created by the client and passed within the POST data of the tokenLogin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. Currently this request allows to change the client identifier for the session. This eases creating the session because the identifier of the client using the session must not be known. For security considerations it can become necessary to drop this parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object conform to the normal [[#ResponseBody | response body]] contrary to the JSON object of the normal login request. This JSON object contains the session identifier, the login, the identifier and the locale of the user.&lt;br /&gt;
&lt;br /&gt;
=== Logout ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=logout&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh secret cookie (since 6.18.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=refreshSecret&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh auto-login cookie ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=store&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Redirect ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login;jsessionid=1157370816112.OX1?action=redirect&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURITY WARNING!''' Utilizing this request is '''INSECURE'''! This request allows to access a session with a single one time token. This one time token may be delivered to the wrong client if the protocol has an error or Apache or the load balancer make a mistake. This will cause a wrong user to be in a wrong session. '''IMMEDIATELY''' consider not to use this request anymore. You have been warned. Use instead the FormLogin that does not need to use the redirect request.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;random&amp;lt;/code&amp;gt; – A session random token to jump into the session. This random token is part of the login response. Only a very short configurable time after the login it is allowed to jump into the session with the random token.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – The client can be defined here newly if it is not correct on the login request itself.&lt;br /&gt;
* &amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt; (optional) – Tells the UI to do a store request after login to be able to use autologin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – The optional path on the webserver to the UI. If this parameter is not given the configured uiWebPath is used.&lt;br /&gt;
&lt;br /&gt;
=== Change IP ===&lt;br /&gt;
&lt;br /&gt;
The following request is especially for integration with systems located in the providers infrastructure. If those systems create a session with the following request the client host IP address in the session can be changed. The IP check for following requests will be done using this newly set client host IP address.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=changeip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; – New IP address of the client host for the current session.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the string &amp;quot;1&amp;quot; as data attribute.&lt;br /&gt;
&lt;br /&gt;
=== Redeem Token (since 7.4.0)===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=redeemToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; – The token created with [[#Get_a_login_token | acquireToken]].&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request. &lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. The client must identifier must be the same for each request after creating the login session. &lt;br /&gt;
* &amp;lt;code&amp;gt;secret&amp;lt;/code&amp;gt; – The value of the secret string for token logins. This is configured through the tokenlogin-secrets configuration file.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method. If configured within tokenlogin-secrets configuration file even the user password will be returned.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;config&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The config module is used to retrieve and set user-specific configuration. The configuration is stored in a tree. Each node of the tree has a name and a value. The values of leaf nodes are strings which store the actual configuration data. The values of inner nodes are defined recursively as objects with one field for each child node. The name and the value of each field is the name and the value of the corresponding child node, respectively.&lt;br /&gt;
&lt;br /&gt;
The namespace looks like the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/ajax/config/&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; – A string containing GUI-specific settings (currently, it is a huge [[#Low_level_protocol | JSON]] object).&lt;br /&gt;
** &amp;lt;code&amp;gt;fastgui&amp;lt;/code&amp;gt; - A string containing GUI-specific settings. This is a JSON object that must be kept small for performance.&lt;br /&gt;
** &amp;lt;code&amp;gt;context_id&amp;lt;/code&amp;gt; - the unique identifier of the context (read-only, added 2008-01-28).&lt;br /&gt;
** &amp;lt;code&amp;gt;cookielifetime&amp;lt;/code&amp;gt; - the cookie life time in seconds or &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; for session cookie (read-only, added 2010-11-16).&lt;br /&gt;
** &amp;lt;code&amp;gt;identifier&amp;lt;/code&amp;gt; – the unique identifier of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;contact_id&amp;lt;/code&amp;gt; – the unique identifier of the contact data of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; – the configured language of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; – the configured timezone of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;availableTimeZones&amp;lt;/code&amp;gt; – a JSON object containing all available time zones. The key is the time zone identifier and the value contains its name in users language. (read-only, added 2010-07-08/v6.18).&lt;br /&gt;
** &amp;lt;code&amp;gt;calendarnotification&amp;lt;/code&amp;gt; - send a mail notification for appointments (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;tasknotification&amp;lt;/code&amp;gt; - send a mail notification for tasks (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;reloadTimes&amp;lt;/code&amp;gt; - Selectable times for GUI reload&lt;br /&gt;
** &amp;lt;code&amp;gt;serverVersion&amp;lt;/code&amp;gt; - Version string of the server.&lt;br /&gt;
** &amp;lt;code&amp;gt;currentTime&amp;lt;/code&amp;gt; - User timezone specific long of the current server time.&lt;br /&gt;
** &amp;lt;code&amp;gt;maxUploadIdleTimeout&amp;lt;/code&amp;gt; - Timeout after that idle uploads are deleted.&lt;br /&gt;
** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard folder of the user&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt; – the standard task folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt; – the standard calendar folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt; – the standard contacts folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt; – the private infostore folder (read-only, since v6.20.1)&lt;br /&gt;
*** &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt; – whether EAS folder selection is enabled (read-only)&lt;br /&gt;
** &amp;lt;code&amp;gt;mail/&amp;lt;/code&amp;gt; – settings for the email module (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with.  (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard email folders (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;htmlinline&amp;lt;/code&amp;gt; – activate inlining of HTML attachments. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;colorquote&amp;lt;/code&amp;gt; – color quoted lines. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;harddelete&amp;lt;/code&amp;gt; – delete emails at once. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;inlineforward&amp;lt;/code&amp;gt; – forward messages as inline or attachment. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;notifyonreadack&amp;lt;/code&amp;gt; – notify on read acknowledgement. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;msgpreview&amp;lt;/code&amp;gt; – show a message preview. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;ignorereplytext&amp;lt;/code&amp;gt; (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;nocopytosent&amp;lt;/code&amp;gt; – don't put a copy to the sent folder when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; - Spam Button should be displayed in GUI or not. (deprecated 2008-04-29)&lt;br /&gt;
** &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;autoSearch&amp;lt;/code&amp;gt; - If a search for all users, groups and resources when participant selection dialog is opened. (read-only, added 2008-10-09/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;maximumNumberParticipants&amp;lt;/code&amp;gt; – Defines the maximum number of participants for appointments and tasks. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;showWithoutEmail&amp;lt;/code&amp;gt; - If external participants without email should be shown.&lt;br /&gt;
*** &amp;lt;code&amp;gt;showDialog&amp;lt;/code&amp;gt; – Enables participant selection dialog for appointments and tasks. (read-only, added 2008-04-30/SP4)&lt;br /&gt;
** &amp;lt;code&amp;gt;availableModules&amp;lt;/code&amp;gt; – Contains a JSON array listing all enabled modules for a user. GUI loads Plugins through this list. To get your plugin listed here, create a subtree below &amp;lt;code&amp;gt;modules/&amp;lt;/code&amp;gt; without a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; subelement or with a subelement containing &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; (read-only, added 2008-02-25)&lt;br /&gt;
** &amp;lt;code&amp;gt;minimumSearchCharacters&amp;lt;/code&amp;gt; – Minimum number of characters a search pattern must have to prevent large responses and slow queries. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
** &amp;lt;code&amp;gt;modules&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;portal&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for portal module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;appendmailtext&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allowhtmlimages&amp;lt;/code&amp;gt; – Alters default setting whether external images contained in HTML content are allowed or not (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;colorquoted&amp;lt;/code&amp;gt; – color quoted lines (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectFolder&amp;lt;/code&amp;gt; – contact folder id to save mail addresses from sent mails (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectEnabled&amp;lt;/code&amp;gt; – switch contact collection on/off (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailAccess&amp;lt;/code&amp;gt; – enables/disables contact collection for incoming mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailTransport&amp;lt;/code&amp;gt; – enables/disables contact collection for outgoing mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;deletemail&amp;lt;/code&amp;gt; – delete emails or move to trash (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
***** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;forwardmessage&amp;lt;/code&amp;gt; – forward messages as inline or attachment (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for mail module&lt;br /&gt;
**** &amp;lt;code&amp;gt;inlineattachments&amp;lt;/code&amp;gt; – activate inlining of HTML attachments (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;linewrap&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – if mail module is enabled or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;phishingheaders&amp;lt;/code&amp;gt; – header(s) identifying phishing headers (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;replyallcc&amp;lt;/code&amp;gt; – put all recipients on reply all into CC (added 2008-12-16/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; – Spam Button should be displayed in GUI or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails (added 2008-02-25)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_conflict&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_teamview&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the calendar module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted appointments (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPrivate&amp;lt;/code&amp;gt; Default status for new appointments in private folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPublic&amp;lt;/code&amp;gt; Default status for new appointments in public folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the contacts module&lt;br /&gt;
**** &amp;lt;code&amp;gt;mailAddressAutoSearch&amp;lt;/code&amp;gt; – Define if a search is triggered when the recipient selection dialog is opened or the folder is changed. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; True if the contact module is enabled for the current user, false otherwise.&lt;br /&gt;
**** &amp;lt;code&amp;gt;singleFolderSearch&amp;lt;/code&amp;gt; – True if the current user is allowed to search for contacts only in a single folder. False if contact searches across all folders are allowed. (read-only, added 2009-02-04/SP5 U1)&lt;br /&gt;
**** &amp;lt;code&amp;gt;characterSearch&amp;lt;/code&amp;gt; – True if the side bar for searching for contacts by a start letter should be displayed. False if the side bar should be hidden. (read-only, added 2009-05-29/6.10)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allFoldersForAutoComplete&amp;lt;/code&amp;gt; – true if an auto complete search may omit the folder identifier array and search for contacts in all readable folders. This is configured through the contact.properties configuration file. (read-only, added 2010-07-22/v6.18.0)&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the tasks module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;delegate_tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted tasks (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined tasks created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined taks that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the infostore module&lt;br /&gt;
**** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – the standard infostore folders (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the default infostore trash folder (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;pictures&amp;lt;/code&amp;gt; – identifier of the default infostore pictures folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;documents&amp;lt;/code&amp;gt; – identifier of the default infostore documents folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;music&amp;lt;/code&amp;gt; – identifier of the default infostore music folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;videos&amp;lt;/code&amp;gt; – identifier of the default infostore videos folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;templates&amp;lt;/code&amp;gt; – identifier of the default infostore templates folder (read-only, since 7.8.0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;interfaces&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;ical&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;syncml&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; UI settings for the folder tree&lt;br /&gt;
**** &amp;lt;code&amp;gt;public_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – Selected folder tree, the user wants to use. Currents trees are 0 for the known OX folder tree and 1 for the new virtual folder tree. (added 2010-04-09/6.18)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.extras&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Extras link in the configuration (read only, added 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to change the Password within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.personaldata&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to edit personal contact information within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.group&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit groups and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.resource&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit resources and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.publish&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to publish items. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to subscribe sources. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;olox20&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Tells the UI if the user is allowed to use the OXtender for Microsoft Outlook 2. (read only, added 2011-03-15/6.20)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is set to false to prevent the UI from trying to load a plugin. (read only, added 2011-03-15/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
****&amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is true if the OXUpdater package is installed and started. (read only, added 2011-06-01/6.20)&lt;br /&gt;
****&amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Is true if the user is allowed to download the OXUpdater. Otherwise it's false. (read only, added 2011-06-01/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;showStrength&amp;lt;/code&amp;gt; – Show a widget, which displays the current passwort Strength while entering. (default: false)&lt;br /&gt;
**** &amp;lt;code&amp;gt;minLength&amp;lt;/code&amp;gt; – The minimum length of an entered password. (default: 4)&lt;br /&gt;
**** &amp;lt;code&amp;gt;maxLength&amp;lt;/code&amp;gt; – The maximum length of an entered password. 0 for unlimited. (default: 0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;regexp&amp;lt;/code&amp;gt; – Defines the class of allowed special characters as Regular Expression. (default: [^a-z0-9])&lt;br /&gt;
**** &amp;lt;code&amp;gt;special&amp;lt;/code&amp;gt; – Shows an example of allowed special characters to the user. Should be a subset of &amp;quot;regexp&amp;quot; in a human readable format. (default: $, _, or %) &lt;br /&gt;
&lt;br /&gt;
=== Get configuration data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
=== Set configuration data ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The new value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config?action=get_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1234&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
Note: Only allowed for context administrator!&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config?action=set_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to set.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the value to set; e.g&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;value&amp;quot;:&amp;quot;test1237&amp;quot;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its new value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1237&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;folders&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The folders module is used to access the OX folder structure.&lt;br /&gt;
&lt;br /&gt;
=== Special System Folders ===&lt;br /&gt;
&lt;br /&gt;
Folders with some kind of special.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! ID !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 6 || contacts || System Users&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get root folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=root&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response: An array with data for all folders at the root level of the folder structure. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common folder data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 6 || last_modified_utc || Timestamp || Timestamp of the last modification. Note that the type is Timestamp, not Time. See [[#Date and time]] for details. (added 2008-10-17, with SP5, temporary workaround)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed folder data&lt;br /&gt;
! ID  !! Name            !! Type             !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || title           || String           || Name of this folder.&lt;br /&gt;
|-&lt;br /&gt;
| 301 || module          || String           || Name of the module which implements this folder; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot;, or &amp;quot;mail&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 302 || type            || Number           || Type of folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || private&lt;br /&gt;
|-&lt;br /&gt;
| 2 || public&lt;br /&gt;
|-&lt;br /&gt;
| 3 || shared&lt;br /&gt;
|-&lt;br /&gt;
| 5 || system folder&lt;br /&gt;
|-&lt;br /&gt;
| 7 || This type is no more in use (legacy type). Will be removed with a future update!&lt;br /&gt;
|-&lt;br /&gt;
| 16 || trash&lt;br /&gt;
|-&lt;br /&gt;
| 20 || pictures&lt;br /&gt;
|-&lt;br /&gt;
| 21 || documents&lt;br /&gt;
|-&lt;br /&gt;
| 22 || music&lt;br /&gt;
|-&lt;br /&gt;
| 23 || videos&lt;br /&gt;
|-&lt;br /&gt;
| 24 || templates&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 304 || subfolders      || Boolean          || true if this folder has subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || own_rights      || Number or String || Permissions which apply to the current user, as described either in [[#PermissionFlags | Permission flags]] or in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| 306 || permissions     || Array            || Each element is an object described in [[#PermissionObject | Permission object]].&lt;br /&gt;
|-&lt;br /&gt;
| 307 || summary         || String           || Information about contained objects.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || standard_folder || Boolean          || Indicates whether or not folder is marked as a default folder (only OX folder)&lt;br /&gt;
|-&lt;br /&gt;
| 309 || total           || Number           || The number of objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 310 || new             || Number           || The number of new objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 311 || unread          || Number           || The number of unread objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 312 || deleted         || Number           || The number of deleted objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 313 || capabilities || Number || Bit mask containing information about mailing system capabilites, as described in [[#Capabilities | capabilities]].&lt;br /&gt;
|-&lt;br /&gt;
| 314 || subscribed || Boolean || Indicates whether this folder should appear in folder tree or not. '''Note:''' Standard folders cannot be unsubscribed.&lt;br /&gt;
|-&lt;br /&gt;
| 315 || subscr_subflds || Boolean || Indicates whether subfolders should appear in folder tree or not.&lt;br /&gt;
|-&lt;br /&gt;
| 316 || standard_folder_type || Number || Indicates the default folder type. Zero for non-default folder. See [[#DefaultTypes | Standard folder types]]&lt;br /&gt;
|-&lt;br /&gt;
| 317 || supported_capabilities || Array || Each element is a String identifying a supported folder capability as described in [[#SupportedCapabilities | supported capabilities]]. Only applicable for non-mail folders. Read Only, Since 7.4.0.&lt;br /&gt;
|-&lt;br /&gt;
| 318 || account_id || String || Will be &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; if the folder does not belong to any account&lt;br /&gt;
(i.e. if its module doesn't support multiple accounts), is a virtual folder or an account-agnostic system folder. Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 3010 || com.openexchange.publish.publicationFlag || Boolean || Indicates whether this folder is published. Read Only, provided by the com.openexchange.publish plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3020 || com.openexchange.subscribe.subscriptionFlag || Boolean || Indicates whether this folder has subscriptions storing their content in this folder. Read Only, provided by the com.openexchange.subscribe plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3030 || com.openexchange.folderstorage.displayName || String || Provides the display of the folder's owner. Read Only, Since 6.20.&lt;br /&gt;
|-&lt;br /&gt;
| 3060 || com.openexchange.share.extendedPermissions || Array || Each element is an object described in [[#ExtendedPermissionObject | Extended permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  0-6 || Folder permissions:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || See the folder.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Create objects in the folder. '''Note''': '''Does not apply to folders of module ''system'''''.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || Create subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Create subfolders&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&amp;lt;br&amp;gt;'''NOTE''': ''Create objects in the folder'' is not covered by ''Create subfolders'' if folder's module is ''system''.&lt;br /&gt;
|-&lt;br /&gt;
|  7-13 || Read permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Read only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Read all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Read all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 14-20 || Write permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Modify only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Modify all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Modify all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 21-27 || Delete permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Delete only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Delete all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Delete all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 28    || Admin flag:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Every operation modifying the folder in some way requires this permission. This are e.g. changing the folder name, modifying the permissions, deleting or moving the folder.&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || For non-mail folders, a number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| rights || String  || For mail folders, the rights string as defined in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capabilities&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Mailing system supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Mailing system supports ordering mails by their thread reference.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Mailing system supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Mailing system supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Mailing system supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note''': Capabilities describe the entire mailing system (mail account), not the specific folder in which they are transmitted. E.g. bit 4 of the capabilities on the user's inbox describes whether subscriptions are supported by the default account, even though the inbox itself cannot be unsubscribed because it's a standard folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DefaultTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Standard Folder Types&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || No default folder.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Task.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Calendar.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Contact.&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Inbox.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Infostore.&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Drafts.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Sent.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Spam.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Trash.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SupportedCapabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Supported Capabilities&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| permissions || Folder storage supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| publication || Folder storage supports folder publication.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Folder storage supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| sort || Folder storage supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| subscription || Folder storage supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get subfolders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;errorOnDuplicateName&amp;lt;/code&amp;gt; – An optional flag to enable or disable (default) check for duplicate folder names within returned folder response (since v6.20.1). If a duplicate folder name is detected, an appropriate error is returned as [[#ResponseBody | response]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders, which have the folder with the requested object ID as parent. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get path ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of a folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all parent nodes until root folder. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for new, modified and deleted folders. New and modified folders are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted folders (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a folder ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested folder. The fields of the object are listed in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id is not present. Since OX access controls are folder-based, the folder object also defines the permissions for the objects it contains. The permissions for a given user or group are defined by the object described in [[#PermissionObject | Permission object]]. The format of the actual permissions depends on the type of the folder. The permissions of mail folders are transmitted as a rights string as defined in section 3 of RFC 2086. Permissions of all other folders are transmitted as a single nonnegative integer number. The permissions for any given action on the folder or on contained objects is defined by a group of bits in the binary representation of this number. Each group of bits is interpreted as a separate number. Zero always means &amp;quot;no permissions&amp;quot;. Any other values add new permissions and always include the permissions of all lower values. The individual values are described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
&lt;br /&gt;
=== Update a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated folder. If the folder was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;cascadePermissions&amp;lt;/code&amp;gt; – (Optional. Defaults to false) Flag to cascade permissions to all sub-folders. The user must have administrative permissions to all sub-folders subject to change. If one permission change fails, the entire operation fails. (Since 7.8.0)&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. Only modified fields are present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder_id&amp;lt;/code&amp;gt; – The parent folder of the newly created folder&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id should not be present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provided that permission is granted to create a folder, its module is bound to the limitation, that the new folder's module must be equal to parent folder's module except that:&lt;br /&gt;
* Parent folder is one of the system folders &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt;. Below these folders task, calendar, and contact modules are permitted.&lt;br /&gt;
* Parent folder's module is one of task, calendar, or contact. Below this kind of folders task, calendar, and contact modules are permitted.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created folder.&lt;br /&gt;
&lt;br /&gt;
=== Delete folders ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The optional timestamp of the last update of the deleted folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered. &lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the folders are deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the folders are not yet located below the trash folder, they are moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of the folders that shall be deleted.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of folders that were '''NOT''' deleted. There may be a lot of different causes for a not deleted folder: A folder has been modified in the mean  time, the user does not have the permission to delete it or those permissions have just been removed, the folder does not exist, etc.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content  ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=clear&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
=== Get all visible folder of a certain module  (since v6.18.2)  ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=allVisible&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;)&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; –  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object containing three fields: &amp;quot;private&amp;quot;, &amp;quot;public, and &amp;quot;shared&amp;quot;. Each field is a JSON array with data for all folders. Each folder is itself described by an array.&lt;br /&gt;
&lt;br /&gt;
=== Get shared folders (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. \&amp;quot;tasks\&amp;quot;, \&amp;quot;calendar\&amp;quot;, \&amp;quot;contacts\&amp;quot;, \&amp;quot;infostore\&amp;quot;). Note: this action is not implemented for module &amp;quot;mail&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders that are considered as shared by the user. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared folder (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared folder to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;tasks&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The tasks module is used to access task information.&lt;br /&gt;
&lt;br /&gt;
=== Get all tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskAndAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task and appointment data&lt;br /&gt;
! ID  !! Name                     !! Type         !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 200 || title                    || String       || Short description.&lt;br /&gt;
|-&lt;br /&gt;
| 201 || start_date               || Date or Time || Inclusive start of the event as Date for tasks and whole day appointments and Time for normal appointments. For sequencies, this date must be part of the sequence, i. e. sequencies always start at this date. (deprecated for tasks since v7.6.1, replaced by start_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 202 || end_date                 || Date or Time || Exclusive end of the event as Date for tasks and whole day appointments and as Time for normal appointments.  (deprecated for tasks since v7.6.1, replaced by end_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 203 || note                     || String       || Long description.&lt;br /&gt;
|-&lt;br /&gt;
| 204 || alarm                    || Number or Time || Specifies when to notify the participants as the number of minutes before the start of the appointment (-1 for &amp;quot;no alarm&amp;quot;). For tasks, the Time value specifies the absolute time when the user should be notified.&lt;br /&gt;
|-&lt;br /&gt;
| 209 || recurrence_type          || Number       || Specifies the type of the recurrence for a task sequence:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none (single event)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || daily&lt;br /&gt;
|-&lt;br /&gt;
| 2 || weekly&lt;br /&gt;
|-&lt;br /&gt;
| 3 || monthly&lt;br /&gt;
|-&lt;br /&gt;
| 4 || yearly&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 212 || days                     || Number       || Specifies which days of the week are part of a sequence. The value is a bitfield with bit 0 indicating sunday, bit 1 indicating monday and so on. May be present if recurrence_type &amp;gt; 1. If allowed but not present, the value defaults to 127 (all 7 days).&lt;br /&gt;
|-&lt;br /&gt;
| 213 || day_in_month             || Number       || Specifies which day of a month is part of the sequence. Counting starts with 1. If the field &amp;quot;days&amp;quot; is also present, only days selected by that field are counted. If the number is bigger than the number of available days, the last available day is selected. Present if and only if recurrence_type &amp;gt; 2.&lt;br /&gt;
|-&lt;br /&gt;
| 214 || month                    || Number       || Month of the year in yearly sequencies. 0 represents January, 1 represents February and so on. Present if and only if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 215 || interval                 || Number       || Specifies an integer multiplier to the interval specified by recurrence_type. Present if and only if recurrence_type &amp;gt; 0. Must be 1 if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 216 || until                    || Date         || Inclusive end date of a sequence. May be present only if recurrence_type &amp;gt; 0. The sequence has no end date if recurrence_type &amp;gt; 0 and this field is not present. Note: since this is a Date, the entire day after the midnight specified by the value is included.&lt;br /&gt;
|-&lt;br /&gt;
| 217 || notification             || Boolean      || If true, all participants are notified of any changes to this object. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client.&lt;br /&gt;
|-&lt;br /&gt;
| 220 || participants             || Array        || Each element identifies a participant, user, group or booked resource as described in [[#Participant | participant table]].&lt;br /&gt;
|-&lt;br /&gt;
| 221 || users                    || Array        || Each element represents a participant as described in [[#UserParticipantObject | User participant object]]. User groups are resolved and are represented by their members. Any user can occur only once.&lt;br /&gt;
|-&lt;br /&gt;
| 222 || occurrences || Number || Specifies how often a recurrence should appear. May be present only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 223 || uid || String || Can only be written when the object is created. Internal and external globally unique identifier of the appointment or task. Is used to recognize appointments within iCal files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 224 || organizer || String || Contains the email address of the appointment organizer which is not necessarily an internal user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 225 || sequence || Number || iCal sequence number. Not implemented for tasks. Must be incremented on update. Will be incremented by the server, if not set.&lt;br /&gt;
|-&lt;br /&gt;
| 226 || confirmations || Array || Each element represents a confirming participant as described in [[#ConfirmingParticipant | confirming participant]]. This can be internal and external user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 227 || organizerId || Number || Contains the userIId of the appointment organizer if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 228 || principal || String || Contains the email address of the appointment principal which is not necessarily an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 229 || principalId || Number || Contains the userIId of the appointment principal if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 401 || full_time   || Boolean || True if the event is a whole day appointment or task, false otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Participant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant identifier&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || User ID&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 2 || user group&lt;br /&gt;
|-&lt;br /&gt;
| 3 || resource&lt;br /&gt;
|-&lt;br /&gt;
| 4 || resource group&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || mail address of an external participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UserParticipantObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | User participant object&lt;br /&gt;
! Name           !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id             || Number || User ID. Confirming for other users only works for appointments and not for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| display_name   || String || Displayable name of the participant.&lt;br /&gt;
|-&lt;br /&gt;
| confirmation   || Number ||&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| confirmmessage || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConfirmingParticipant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Confirming participant&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || email address of external participant&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || display name of external participant&lt;br /&gt;
|-&lt;br /&gt;
| status || Number ||&lt;br /&gt;
{|&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| message || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task data&lt;br /&gt;
! ID  !! Name              !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || status            || Number || Status of the task:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || not started&lt;br /&gt;
|-&lt;br /&gt;
| 2 || in progress&lt;br /&gt;
|-&lt;br /&gt;
| 3 || done&lt;br /&gt;
|-&lt;br /&gt;
| 4 || waiting&lt;br /&gt;
|-&lt;br /&gt;
| 5 || deferred&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 301 || percent_completed || Number || How much of the task is completed. An integer number between 0 and 100.&lt;br /&gt;
|-&lt;br /&gt;
| 302 || actual_costs|| Number || A monetary attribute to store actual costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 303 || actual_duration&lt;br /&gt;
|-&lt;br /&gt;
| 304 || after_complete || Date || Deprecated. Only present in AJAX interface. Value will not be stored on OX server.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || billing_information&lt;br /&gt;
|-&lt;br /&gt;
| 307 || target_costs|| Number || A monetary attribute to store target costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || target_duration&lt;br /&gt;
|-&lt;br /&gt;
| 309 || priority || Number || 1 = LOW, 2 = MEDIUM, 3 = HIGH&lt;br /&gt;
|-&lt;br /&gt;
| 312 || currency&lt;br /&gt;
|-&lt;br /&gt;
| 313 || trip_meter&lt;br /&gt;
|-&lt;br /&gt;
| 314 || companies&lt;br /&gt;
|-&lt;br /&gt;
| 315 || date_completed&lt;br /&gt;
|-&lt;br /&gt;
| 316 || start_time               || Date or Time || Inclusive start as Date for whole day tasks and Time for normal tasks. &lt;br /&gt;
|-&lt;br /&gt;
| 317 || end_time                 || Date or Time || Exclusive end as Date for whole day tasks and as Time for normal tasks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested tasks.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; – Which kinds of updates should be ignored. Omit this parameter or set it to &amp;quot;deleted&amp;quot; to not have deleted tasks identifier in the response. Set this parameter to &amp;quot;false&amp;quot; and the response contains deleted tasks identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted tasks. New and modified tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted tasks would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a task ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the task's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested task. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder Identifier through that the task is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated task.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated task. If the task was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
=== Create a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created task.&lt;br /&gt;
&lt;br /&gt;
=== Delete task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An object in the field “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete tasks (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Confirm task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the to confirm task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through that the task is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirm task.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot; and &amp;quot;confirmmessage&amp;quot; as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Search for tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified , then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object with attributes described in [[#SearchTasks | Search tasks]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchTasks&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search tasks&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find tasks. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || (optional) Defines the folder to search for tasks in. If this is omitted in all task folders will be searched.&lt;br /&gt;
|-&lt;br /&gt;
| start || Date or Time || (optional) Inclusive start date for a time range the tasks should end in. If start is omitted end is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| end || Date or Time || (optional) Exclusive end date for a time range the tasks should end in. If this parameter is omitted the time range has an open end.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with matching tasks. Tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;contacts&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The contacts module is used to access contact information.&lt;br /&gt;
&lt;br /&gt;
=== Get all contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried (optional from 6.22.2 on: If not set, the contents of all visible folders are used instead).&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedContactData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed contact data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 223 ||  || uid         || String || Can only be written when the object is created. Internal and external globally unique identifier of the contact. Is used to recognize contacts within vCard files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 500 || Display name                || display_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 501 || Given name                  || first_name           || String || First name.&lt;br /&gt;
|-&lt;br /&gt;
| 502 || Sur name                    || last_name            || String || Last name.&lt;br /&gt;
|-&lt;br /&gt;
| 503 || Middle name                 || second_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 504 || Suffix                      || suffix               || String&lt;br /&gt;
|-&lt;br /&gt;
| 505 || Title                       || title                || String&lt;br /&gt;
|-&lt;br /&gt;
| 506 || Street home                 || street_home          || String&lt;br /&gt;
|-&lt;br /&gt;
| 507 || Postal code home            || postal_code_home || String&lt;br /&gt;
|-&lt;br /&gt;
| 508 || City home                   || city_home            || String&lt;br /&gt;
|-&lt;br /&gt;
| 509 || State home                  || state_home           || String&lt;br /&gt;
|-&lt;br /&gt;
| 510 || Country home                || country_home         || String&lt;br /&gt;
|-&lt;br /&gt;
| 511 || Birthday                    || birthday             || Date&lt;br /&gt;
|-&lt;br /&gt;
| 512 || Marital status              || marital_status || String&lt;br /&gt;
|-&lt;br /&gt;
| 513 || Number of children          || number_of_children || String&lt;br /&gt;
|-&lt;br /&gt;
| 514 || Profession                  || profession           || String&lt;br /&gt;
|-&lt;br /&gt;
| 515 || Nickname                    || nickname             || String&lt;br /&gt;
|-&lt;br /&gt;
| 516 || Spouse name                 || spouse_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 517 || Anniversary                 || anniversary          || Date&lt;br /&gt;
|-&lt;br /&gt;
| 518 || Note                        || note                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 519 || Department                  || department           || String&lt;br /&gt;
|-&lt;br /&gt;
| 520 || Position                    || position             || String&lt;br /&gt;
|-&lt;br /&gt;
| 521 || Employee type               || employee_type  || String&lt;br /&gt;
|-&lt;br /&gt;
| 522 || Room number                 || room_number || String&lt;br /&gt;
|-&lt;br /&gt;
| 523 || Street business             || street_business      || String&lt;br /&gt;
|-&lt;br /&gt;
| 524 || Internal user id            || user_id || Number&lt;br /&gt;
|-&lt;br /&gt;
| 525 || Postal code business        || postal_code_business || String&lt;br /&gt;
|-&lt;br /&gt;
| 526 || City business               || city_business        || String&lt;br /&gt;
|-&lt;br /&gt;
| 527 || State business              || state_business       || String&lt;br /&gt;
|-&lt;br /&gt;
| 528 || Country business            || country_business     || String&lt;br /&gt;
|-&lt;br /&gt;
| 529 || Number of employee          || number_of_employees || String&lt;br /&gt;
|-&lt;br /&gt;
| 530 || Sales volume                || sales_volume || String&lt;br /&gt;
|-&lt;br /&gt;
| 531 || Tax id                      || tax_id               || String&lt;br /&gt;
|-&lt;br /&gt;
| 532 || Commercial register         || commercial_register  || String&lt;br /&gt;
|-&lt;br /&gt;
| 533 || Branches                    || branches             || String&lt;br /&gt;
|-&lt;br /&gt;
| 534 || Business category           || business_category    || String&lt;br /&gt;
|-&lt;br /&gt;
| 535 || Info                        || info                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 536 || Manager's name              || manager_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 537 || Assistant's name            || assistant_name       || String&lt;br /&gt;
|-&lt;br /&gt;
| 538 || Street other                || street_other         || String&lt;br /&gt;
|-&lt;br /&gt;
| 539 || City other                  || city_other           || String&lt;br /&gt;
|-&lt;br /&gt;
| 540 || Postal code other           || postal_code_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 541 || Country other               || country_other        || String&lt;br /&gt;
|-&lt;br /&gt;
| 542 || Telephone business 1        || telephone_business1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 543 || Telephone business 2        || telephone_business2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 544 || FAX business                || fax_business         || String&lt;br /&gt;
|-&lt;br /&gt;
| 545 || Telephone callback          || telephone_callback   || String&lt;br /&gt;
|-&lt;br /&gt;
| 546 || Telephone car               || telephone_car        || String&lt;br /&gt;
|-&lt;br /&gt;
| 547 || Telephone company           || telephone_company    || String&lt;br /&gt;
|-&lt;br /&gt;
| 548 || Telephone home 1            || telephone_home1      || String&lt;br /&gt;
|-&lt;br /&gt;
| 549 || Telephone home 2            || telephone_home2      || String&lt;br /&gt;
|-&lt;br /&gt;
| 550 || FAX home                    || fax_home             || String&lt;br /&gt;
|-&lt;br /&gt;
| 551 || Cellular telephone 1        || cellular_telephone1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 552 || Cellular telephone 2        || cellular_telephone2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 553 || Telephone other             || telephone_other      || String&lt;br /&gt;
|-&lt;br /&gt;
| 554 || FAX other                   || fax_other            || String&lt;br /&gt;
|-&lt;br /&gt;
| 555 || Email 1                     || email1               || String&lt;br /&gt;
|-&lt;br /&gt;
| 556 || Email 2                     || email2               || String&lt;br /&gt;
|-&lt;br /&gt;
| 557 || Email 3                     || email3               || String&lt;br /&gt;
|-&lt;br /&gt;
| 558 || URL                         || url                  || String&lt;br /&gt;
|-&lt;br /&gt;
| 559 || Telephone ISDN              || telephone_isdn       || String&lt;br /&gt;
|-&lt;br /&gt;
| 560 || Telephone pager             || telephone_pager      || String&lt;br /&gt;
|-&lt;br /&gt;
| 561 || Telephone primary           || telephone_primary    || String&lt;br /&gt;
|-&lt;br /&gt;
| 562 || Telephone radio             || telephone_radio      || String&lt;br /&gt;
|-&lt;br /&gt;
| 563 || Telephone telex             || telephone_telex      || String&lt;br /&gt;
|-&lt;br /&gt;
| 564 || Telephone TTY/TDD           || telephone_ttytdd     || String&lt;br /&gt;
|-&lt;br /&gt;
| 565 || Instantmessenger 1          || instant_messenger1   || String&lt;br /&gt;
|-&lt;br /&gt;
| 566 || Instantmessenger 2          || instant_messenger2   || String&lt;br /&gt;
|-&lt;br /&gt;
| 567 || Telephone IP                || telephone_ip         || String&lt;br /&gt;
|-&lt;br /&gt;
| 568 || Telephone assistant         || telephone_assistant  || String&lt;br /&gt;
|-&lt;br /&gt;
| 569 || Company                     || company              || String&lt;br /&gt;
|-&lt;br /&gt;
| 570 ||                             || image1 || String&lt;br /&gt;
|-&lt;br /&gt;
| 571 || Dynamic Field 1             || userfield01 || String&lt;br /&gt;
|-&lt;br /&gt;
| 572 || Dynamic Field 2             || userfield02 || String&lt;br /&gt;
|-&lt;br /&gt;
| 573 || Dynamic Field 3             || userfield03 || String&lt;br /&gt;
|-&lt;br /&gt;
| 574 || Dynamic Field 4             || userfield04 || String&lt;br /&gt;
|-&lt;br /&gt;
| 575 || Dynamic Field 5             || userfield05 || String&lt;br /&gt;
|-&lt;br /&gt;
| 576 || Dynamic Field 6             || userfield06 || String&lt;br /&gt;
|-&lt;br /&gt;
| 577 || Dynamic Field 7             || userfield07 || String&lt;br /&gt;
|-&lt;br /&gt;
| 578 || Dynamic Field 8             || userfield08 || String&lt;br /&gt;
|-&lt;br /&gt;
| 579 || Dynamic Field 9             || userfield09 || String&lt;br /&gt;
|-&lt;br /&gt;
| 580 || Dynamic Field 10            || userfield10 || String&lt;br /&gt;
|-&lt;br /&gt;
| 581 || Dynamic Field 11            || userfield11 || String&lt;br /&gt;
|-&lt;br /&gt;
| 582 || Dynamic Field 12            || userfield12 || String&lt;br /&gt;
|-&lt;br /&gt;
| 583 || Dynamic Field 13            || userfield13 || String&lt;br /&gt;
|-&lt;br /&gt;
| 584 || Dynamic Field 14            || userfield14 || String&lt;br /&gt;
|-&lt;br /&gt;
| 585 || Dynamic Field 15            || userfield15 || String&lt;br /&gt;
|-&lt;br /&gt;
| 586 || Dynamic Field 16            || userfield16 || String&lt;br /&gt;
|-&lt;br /&gt;
| 587 || Dynamic Field 17            || userfield17 || String&lt;br /&gt;
|-&lt;br /&gt;
| 588 || Dynamic Field 18            || userfield18 || String&lt;br /&gt;
|-&lt;br /&gt;
| 589 || Dynamic Field 19            || userfield19 || String&lt;br /&gt;
|-&lt;br /&gt;
| 590 || Dynamic Field 20            || userfield20 || String || Contains a UUID if one was assigned (after 6.18.2)&lt;br /&gt;
|-&lt;br /&gt;
| 592 ||                             || distribution_list    || Array  || If this contact is a distribution list, then this field is an array of objects. Each object describes a member of the list as defined in [[#DistributionListMember | Distribution list member]].&lt;br /&gt;
|-&lt;br /&gt;
| 594 || Number of distributionlists || number_of_distribution_list || Number&lt;br /&gt;
|-&lt;br /&gt;
| 596 ||                             || number_of_images || Number&lt;br /&gt;
|-&lt;br /&gt;
| 597 ||                             || image_last_modified || Timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 598 || State other                 || state_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 599 ||                             || file_as || String&lt;br /&gt;
|-&lt;br /&gt;
| 601 ||                             || image1_content_type || String&lt;br /&gt;
|-&lt;br /&gt;
| 602 ||                             || mark_as_distributionlist || Boolean&lt;br /&gt;
|-&lt;br /&gt;
| 605 || Default address             || default_address || Number&lt;br /&gt;
|-&lt;br /&gt;
| 606 ||                             || image1_url || String&lt;br /&gt;
|-&lt;br /&gt;
| 608 ||                             || useCount || Number || In case of sorting purposes the column 609 is also available, which places global address book contacts at the beginning of the result. If 609 is used, the order direction (ASC, DESC) is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 610 ||                             || yomiFirstName || String || Kana based representation for the First Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 611 ||                             || yomiLastName || String || Kana based representation for the Last Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 612 ||                             || yomiCompany || String || Kana based representation for the Company. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 613 ||                             || addressHome || String || Support for Outlook 'home' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 614 ||                             || addressBusiness || String || Support for Outlook 'business' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 615 ||                             || addressOther || String || Support for Outlook 'other' address field. (since 6.20.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DistributionListMember&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Distribution list member&lt;br /&gt;
! Name       !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id         || String || Object ID of the member's contact if the member is an existing contact.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Parent folder ID of the member's contact if the member is an existing contact (preliminary, from 6.22 on).&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| mail       || String || Email address (mandatory before 6.22, afterwards optional if you are referring to an internal contact)&lt;br /&gt;
|-&lt;br /&gt;
| mail_field || Number || Which email field of an existing contact (if any) is used for the mail field.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || independent contact&lt;br /&gt;
|-&lt;br /&gt;
| 1 || default email field (email1)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || second email field (email2)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || third email field (email3)&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects. Each object contains fields “id” and “folder” of requested contacts.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=listuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with id&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
Available with SP4&lt;br /&gt;
&lt;br /&gt;
=== Get updated contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested contacts.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted contacts. New and modified contacts are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted contacts (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a contact ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the contact's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Get contact by user ID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=getuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – User ID (not Object ID) of the requested user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. &lt;br /&gt;
&lt;br /&gt;
Available with SP4 package.&lt;br /&gt;
&lt;br /&gt;
=== Update a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder identifier through that the contact is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated contact. If the contact was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
To remove some contact image send the image attribute set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To change or add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File_uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Create a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created contact.&lt;br /&gt;
&lt;br /&gt;
To add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Delete contacts (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected contacts with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchContacts | Search contacts]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContacts&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find contacts. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves. Matching is performed against any substring of the field &amp;lt;code&amp;gt;display_name&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search contacts with the given startletter. If this field is present, the pattern is matched against the contact field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Array of Number || If a list of folder identifiers or at least a single folder identifier is given, only in that folders will be searched for contacts. This paramenter is optional but searching in all contact folders that are viewable and where objects can be read in is more expensive on that database than searching in a dedicated number of them. The possibility to provide here an array of folder identifier has been added with 6.10.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchContactsAlternative | Search contacts alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContactsAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches contacts where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches contacts where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches contacts where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| email1 || String || Searches contacts where the email1 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email2 || String || Searches contacts where the email2 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email3 || String || Searches contacts where the email3 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| company || String || Searches contacts where the company match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| categories || String || Searches contacts where the categories match with the given search pattern. &lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, a contact is returned if any specified pattern matches at the start of the corresponding field. Otherwise, a contact is returned if all specified patterns match any substring of the corresponding field.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed as if orSearch were set to true. The actual value of orSearch is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| exactMatch || Boolean || If set to true, contacts are returned where the specified patterns match the corresponding fields exactly. Otherwise, a 'startsWith' or 'substring' comparison is used based on the 'orSearch' parameter. (requires version &amp;gt; 6.22.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by filter (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=advancedSearch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#Module_.22search.22_.28alternative_suggestion.2C_still_preliminary.29 | Search Filter]]&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by anniversary (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose anniversary falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=anniversaries&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their anniversary in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by birthday (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose birthday falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=birthdays&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their birthday in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Auto-complete contacts (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts based on a prefix, usually used to auto-complete e-mail recipients while the user is typing.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; – The query to search for.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; (optional)  – Whether to only include contacts with at least one e-mail address. Defaults to &amp;quot;true&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. Since 7.8.1: If this parameter is missing, response is sorted by a user-specific use count of contacts, ID of contacts' parent folder and display name.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is &lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;calendar&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The calendar module is used to access calendar data.&lt;br /&gt;
&lt;br /&gt;
=== Get all appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) – Object ID of the folder, whose contents are queried. If not specified, defaults to all calendar folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which start on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which end before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Appointment sequencies are broken up into individual appointments and each occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed appointment data&lt;br /&gt;
! ID  !! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 206 || recurrence_id            || Number       || Object ID of the entire appointment sequence. Present on series and change exception appointments. Equals to object identifier on series appointment and is different to object identifier on change exceptions.&lt;br /&gt;
|-&lt;br /&gt;
| 207 || recurrence_position      || Number       || 1-based position of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 208 || recurrence_date_position || Date         || Date of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 210 || change_exceptions                     || Array       || An array of Dates, representing all change exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 211 || delete_exceptions                     || Array       || An array of Dates, representing all delete exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 400 || location    || String  || Location&lt;br /&gt;
|-&lt;br /&gt;
| 402 || shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 408 || timezone    || String  || Timezone&lt;br /&gt;
|-&lt;br /&gt;
| 410 || recurrence_start    || Date  || Start of a sequence without time&lt;br /&gt;
|-&lt;br /&gt;
|  || ignore_conflicts || Boolean  || Ignore soft conflicts for the new or modified appointment. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get appointment information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=has&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response is an array of booleans. Array length is the number of days. Each entry in the array corresponds with one day in the range that was queried, explaining whether there is an appointment on this day or not.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with full object IDs (folder, id and optionally either recurrence_position or recurrence_date_position) of requested appointments.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an appointment&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| pos  || Number || Value of the field recurrence_position, if present in the appointment.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get updated appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried. That parameter may be absent in case &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is set to &amp;quot;deleted&amp;quot;, which means all accessible calendar folders are considered. If  &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is not set to &amp;quot;deleted&amp;quot;, that parameter is mandatory.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested appointments.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted appointments. New and modified appointments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted appointments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by objects described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]] instead of arrays. Appointment sequencies are broken up into individual appointments and each modified occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
=== Get an appointment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_position&amp;lt;/code&amp;gt; (optional) – Recurrence Position requested appointment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested appointment. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the appointment's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated appointment. If the appointment was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field recurrence_id is always present if it is present in the original appointment. The field recurrence_position is present if it is present in the original appointment and only this single appointment should be modified. The field id is not present because it is already included as a parameter. Other fields are present only if modified.&lt;br /&gt;
&lt;br /&gt;
=== Create an appointment ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: If the appointment was created successfully, an object with the attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created appointment. If the appointment could not be created due to conflicts, the response body is an object with the field &amp;lt;code&amp;gt;conflicts&amp;lt;/code&amp;gt;, which is an array of appointment objects which caused the conflict. Each appointment object which represents a resource conflict contains an additional field &amp;lt;code&amp;gt;hard_conflict&amp;lt;/code&amp;gt; with the Boolean value true. If the user does not have read access to a conflicting appointment, only the fields &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;end_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shown_as&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; are present and the field &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; contains only the participants which caused the conflict.&lt;br /&gt;
&lt;br /&gt;
=== Delete an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: The appointment object to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Delete appointments (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of appointment objects to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Confirm appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the appointment to confirm.&lt;br /&gt;
* &amp;lt;code&amp;gt;occurrence&amp;lt;/code&amp;gt; – The numeric identifier of the occurrence to which the confirmation applies (in case &amp;quot;id&amp;quot; denotes a series appointment). Available with v7.6.0&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through which the appointment is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirmed appointment.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot;, &amp;quot;confirmmessage&amp;quot; and &amp;quot;id&amp;quot; (optional) as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Free &amp;amp; Busy ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - Internal user id. Must be obtained from the contact module.&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; - Constant for user or resource (1 for users, 3 for resources)&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which lie between start and end as described.&amp;lt;br&amp;gt;&lt;br /&gt;
This objects consist of:&lt;br /&gt;
{| id=&amp;quot;FreeAndBusyAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| start_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|- &lt;br /&gt;
| end_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Folder ID. Only set, if the user has the right to see the object. (added 2009-08-18/6.12) &lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean || True if the appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Search appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchAppointments&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search appointments&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find appointments. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search appointments with the given starting letter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get new appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=newappointments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; – limits the number of returned object to the given value.&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Resolve UID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=resolveuid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The UID to be resolved.&lt;br /&gt;
&lt;br /&gt;
Response: An object object with the field &amp;quot;id&amp;quot; containing the ox-object id, if existing, an error message otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Get all Change Exceptions (Since v7.2.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=getChangeExceptions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object id of the appointment series.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointments. &lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The mail module is used to access mail data.&lt;br /&gt;
&lt;br /&gt;
When mails are stored on an IMAP server, some functionality is not available due to restrictions of the IMAP protocol. Such functionality is marked with &amp;quot;not IMAP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get mail count ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=count&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder whose mail count is queried&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An integer value representing folder's mail count&lt;br /&gt;
&lt;br /&gt;
=== Get all mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedMailData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed mail data&lt;br /&gt;
! ID  !! Name                 !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 102 || color_label || Number || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive).&lt;br /&gt;
|-&lt;br /&gt;
| 600 || id                   || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 601 || folder_id            || String  || Object ID of the parent folder&lt;br /&gt;
|-&lt;br /&gt;
| 602 || attachment           || Boolean || Specifies whether this mail has attachments.&lt;br /&gt;
|-&lt;br /&gt;
| 603 || from                 || Array   || Each element is a two-element array specifying one sender. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values.&lt;br /&gt;
|-&lt;br /&gt;
| 604 || to                   || Array   || Each element is a two-element array (see the from field) specifying one receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 605 || cc                   || Array   || Each element is a two-element array (see the from field) specifying one carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 606 || bcc                  || Array   || Each element is a two-element array (see the from field) specifying one blind carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 607 || subject              || String  || Subject line.&lt;br /&gt;
|-&lt;br /&gt;
| 608 || size                 || Number  || Size of the mail in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 609 || sent_date            || Time    || Date and time as specified in the mail by the sending client.&lt;br /&gt;
|-&lt;br /&gt;
| 610 || received_date        || Time    || Date and time as measured by the receiving server.&lt;br /&gt;
|-&lt;br /&gt;
| 611 || flags                || Number  || Various system flags. A sum of zero or more of following values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || answered&lt;br /&gt;
|-&lt;br /&gt;
| 2  || deleted&lt;br /&gt;
|-&lt;br /&gt;
| 4  || draft&lt;br /&gt;
|-&lt;br /&gt;
| 8  || flagged&lt;br /&gt;
|-&lt;br /&gt;
| 16 || recent&lt;br /&gt;
|-&lt;br /&gt;
| 32 || seen&lt;br /&gt;
|-&lt;br /&gt;
| 64 || user&lt;br /&gt;
|-&lt;br /&gt;
| 128 || spam&lt;br /&gt;
|-&lt;br /&gt;
| 256 || forwarded&lt;br /&gt;
|}&lt;br /&gt;
See javax.mail.Flags.Flag for details.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || level                || Number  || Zero-based nesting level in a thread.&lt;br /&gt;
|-&lt;br /&gt;
| 613 || disp_notification_to || String  || Content of message's header “Disposition-Notification-To”&lt;br /&gt;
|-&lt;br /&gt;
| 614 || priority             || Number  || Value of message's “X-Priority” header:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0   || No priority&lt;br /&gt;
|-&lt;br /&gt;
| 5   || Very Low&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Low&lt;br /&gt;
|-&lt;br /&gt;
| 3   || Normal&lt;br /&gt;
|-&lt;br /&gt;
| 2   || High&lt;br /&gt;
|-&lt;br /&gt;
| 1   || Very High&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 615  || msg_ref                 || String  || Message reference on reply/forward.&lt;br /&gt;
|-&lt;br /&gt;
| 651  || flag_seen                 || String  || Special field to sort mails by seen status&lt;br /&gt;
|-&lt;br /&gt;
| 652  || account_name                 || String  || Message's account name.&lt;br /&gt;
|-&lt;br /&gt;
| 653  || account_id                 || int  || Message's account identifier. Since v6.20.2&lt;br /&gt;
|-&lt;br /&gt;
|     || user                 || Array  || An array with user-defined flags as strings.&lt;br /&gt;
|-&lt;br /&gt;
|     || headers                 || Object  || An object with a field for every non-standard header. The header name is the field name. The header value is the value of the field as string.&lt;br /&gt;
|-&lt;br /&gt;
|     || attachments          || Array   || Each element is an attachment as described in [[#Attachment | Attachment]]. The first element is the mail text. If the mail has multiple representations (multipart-alternative), then the alternatives are placed after the mail text and have the field disp set to alternative.&lt;br /&gt;
|-&lt;br /&gt;
|     || nested_msgs          || Array   || Each element is a mail object as described in this table, except for fields id, folder_id and attachment.&lt;br /&gt;
|-&lt;br /&gt;
|     || truncated          || boolean   || true/false if the mail content was trimmed. Since v7.6.1&lt;br /&gt;
|-&lt;br /&gt;
|     || source             || String    || RFC822 source of the mail. Only present for &amp;lt;tt&amp;gt;action=get&amp;amp;attach_src=true&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|     || cid                || String    || The value of the &amp;quot;Content-ID&amp;quot; header, if the header is present.&lt;br /&gt;
|-&lt;br /&gt;
| 654  || original_id                 || String  || The original mail identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|-&lt;br /&gt;
| 655  || original_folder_id                 || String  || The original folder identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Attachment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || String || Object ID (unique only inside the same message)&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || MIME type&lt;br /&gt;
|-&lt;br /&gt;
| content      || String || Content as text. Present only if easily convertible to text.&lt;br /&gt;
|-&lt;br /&gt;
| filename     || String || Displayed filename (mutually exclusive with content).&lt;br /&gt;
|-&lt;br /&gt;
| size         || Number || Size of the attachment in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| disp         || String || Attachment's disposition: null, inline, attachment or alternative.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all mail conversations (since v7.x) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=threadedAll&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;includeSent&amp;lt;/code&amp;gt; - A boolean value to signal that conversations also include messages taken from special &amp;quot;sent&amp;quot; aka &amp;quot;sent items&amp;quot; folder&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON array consisting of JSON objects, each representing a conversation's root message along with its message thread. The root message's JSON object is filled according to specified columns and is enhanced by special &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field representing the full message thread (including the root message itself). The &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field is a JSON array of JSON objects; each representing a message in the conversation sorted by time-line, also filled with specified columns. E.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
   &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
   &amp;quot;unreadCount&amp;quot;:0,&lt;br /&gt;
   &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
   &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
   &amp;quot;thread&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263853&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;26323&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/Sent&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263854&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Search mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON array of JSON objects each containing the search field and its search pattern: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;col&amp;quot;: 612, &amp;quot;pattern&amp;quot;: &amp;quot;Joe&amp;quot;}, {&amp;quot;col&amp;quot;: 614, &amp;quot;pattern&amp;quot;: &amp;quot;Tuesday&amp;quot;}]&amp;lt;/code&amp;gt; Supported values for &amp;lt;code&amp;gt;col&amp;lt;/code&amp;gt; are 603 to 607 (from, to, cc, bcc and subject) and -1 for full text search.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;headers&amp;lt;/code&amp;gt; - (preliminary) A comma-separated list of header names. Each name requests denoted header from each mail&lt;br /&gt;
&lt;br /&gt;
Request body: An array with one object for each requested mail. Each object contains the fields &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter followed by requested headers.&lt;br /&gt;
&lt;br /&gt;
=== Copy mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the copied mail&lt;br /&gt;
&lt;br /&gt;
=== Move mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the moved mail&lt;br /&gt;
&lt;br /&gt;
=== Update mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
'''Note''': If neither parameter &amp;quot;&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&amp;quot; nor parameter &amp;quot;&amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt;&amp;quot; is specified, all folder's messages are updated accordingly. Available with v6.20.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object which carries the new values that ought to be applied to mail as described in [[#UpdateMail | Update mail]] or [[#UpdateMailExtended | Update mail extended]] (available with SP6 v6.10).&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the Object ID of the updated mail and its folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMail&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| color_label || Number || The color number between 0 and 10.&lt;br /&gt;
|-&lt;br /&gt;
| flags || Number || A set of flags to add or remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| value || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to add the flags specified by &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (logical OR), &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to remove them (logical AND with the inverted value).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMailExtended&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail extended (available with SP6 v6.10)&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| set_flags || Number || A set of flags to add. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| clear_flags || Number || A set of flags to remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mark all mails as seen (available with v7.6.0) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=all_seen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: n.a.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Not IMAP: Get updated mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Just an empty JSON array is going to be returned since this action cannot be applied to IMAP.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the mail's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; (optional) – 1 indicates that this request should fill the message compose dialog to edit a message and thus display-specific date is going to be withheld.&lt;br /&gt;
* &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain only the (formatted) message headers as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain the complete message source as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; (optional) – 1 to write the complete message source to output stream. '''NOTE:''' This parameter will only be used if parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; is set to 1.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP4)&lt;br /&gt;
** &amp;quot;raw&amp;quot; returns the content as it is, meaning no preparation are performed and thus no guarantee for safe contents is given (available with SP6 v6.10).&lt;br /&gt;
** &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML.&lt;br /&gt;
** &amp;quot;textNoHtmlAttach&amp;quot; is the same as &amp;quot;text&amp;quot;, but does not deliver the HTML part as attachment in case of multipart/alternative content.&lt;br /&gt;
** &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).&lt;br /&gt;
** &amp;quot;noimg&amp;quot; to allow a possible HTML content being transferred but without original image src attributes which references external images: Can be used to prevent loading external linked images (spam privacy protection).&lt;br /&gt;
** '''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;unseen&amp;lt;/code&amp;gt; (optional) – &amp;quot;1&amp;quot; or &amp;quot;true&amp;quot; to leave an unseen mail as unseen although its content is requested&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
* &amp;lt;code&amp;gt;attach_src&amp;lt;/code&amp;gt; (optional - available since v7.6.1) 1 to let the JSON mail representation being extended by &amp;lt;code&amp;gt;&amp;quot;source&amp;quot;&amp;lt;/code&amp;gt; field containing the mail raw RFC822 source data&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included. '''NOTE:''' Of course response is not a JSON object if either parameter &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; or parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; are set to &amp;quot;1&amp;quot;. Then the response contains plain text. Moreover if optional parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to &amp;quot;1&amp;quot; the complete message source is going to be directly written to output stream to open browser's save dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mails as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_messages&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; –  A comma-separated list of Object IDs of the requested mails&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=attachment&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – ID of the requested attachment '''OR'''&lt;br /&gt;
* &amp;lt;code&amp;gt;cid&amp;lt;/code&amp;gt; – Value of header 'Content-ID' of the requested attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; – 1 overwrites the defined mimetype for this attachment to force the download dialog, otherwise 0.&lt;br /&gt;
* &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt; (optional) – 1 to apply HTML white-list filter rules if and only if requested attachment is of MIME type &amp;lt;code&amp;gt;text/htm*&amp;lt;/code&amp;gt; '''AND''' parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to 0.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this attachment, except the parameter save is set to 1.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mail attachments as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachments.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – A comma-separated list of IDs of the requested attachments&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Send a mail ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;lineWrapAfter&amp;lt;/code&amp;gt; – An integer value specifying the line-wrap setting (only effective for plain-text content); if absent the setting is taken from user's mail settings. Available with v7.8.1.&lt;br /&gt;
&lt;br /&gt;
Request Body: This method uses the encoding multipart/form-data or multipart/mixed.&lt;br /&gt;
* The form filed &amp;lt;code&amp;gt;json_0&amp;lt;/code&amp;gt; contains the rudimentary mail as JSON object as described in [[#DetailedMailData | Detailed mail data]] with just its message body (as html content) defined in nested JSON array &amp;quot;attachments&amp;quot; and its header data (from, to, subject, etc.). The field &amp;quot;content_type&amp;quot; defines whether the mail ought to be sent as plain text (&amp;quot;text/plain&amp;quot;), as html (&amp;quot;text/html&amp;quot;) or  as multipart/alternative (&amp;quot;ALTERNATIVE&amp;quot;). Sending a mail requires some special fields inside JSON mail object. The field &amp;quot;infostore_ids&amp;quot; defines a JSON array of infostore document ID(s) that ought to be appended to this mail as attachments. The field &amp;quot;msgref&amp;quot; indicates the ID of the referenced original mail. Moreover the field &amp;quot;sendtype&amp;quot; indicates the type of the message:&lt;br /&gt;
** 0 - A normal new mail (optional)&lt;br /&gt;
** 1 - A reply mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 2 - A forward mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 3 - A draft edit operation. The field &amp;quot;msgref&amp;quot; must be present in order to delete previous draft message since e.g. IMAP does not support changing/replacing a message but requires a delete-and-insert sequence&lt;br /&gt;
** 4 - Transport of a draft mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 6 - This type signals that user intends to send out a saved draft message and expects the draft message (referenced by &amp;quot;msgref&amp;quot; field) being deleted after successful transport&lt;br /&gt;
Example of a normal new mail which appends user's VCard and requests a read receipt from receiver:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Content-Disposition: form-data; name=&amp;quot;json_0&amp;quot;....{&amp;quot;from&amp;quot;:&amp;quot;\u0022Muster, Karl\u0022 &amp;lt;karl.muster@somewhere.com&amp;gt;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;someone@somewhere.com&amp;quot;,&amp;quot;cc&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bcc&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;subject&amp;quot;:&amp;quot;Mail Subject&amp;quot;,&amp;quot;priority&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;disp_notification_to&amp;quot;:true,&amp;quot;vcard&amp;quot;:1,&lt;br /&gt;
&amp;quot;attachments&amp;quot;:[{&amp;quot;content_type&amp;quot;:&amp;quot;ALTERNATIVE&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;Simple Mail Text!&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;\u000a\u000a&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* The request accepts file fields in upload form that denote referenced files that are going to be appended as attachments&lt;br /&gt;
* For &amp;quot;text/plain&amp;quot; mail bodies, the JSON boolean field &amp;quot;raw&amp;quot; may be specified inside the body's JSON representation to signal that the text content shall be kept as-is; meaning to keep all formatting intact&lt;br /&gt;
&lt;br /&gt;
==== Attach data sources ====&lt;br /&gt;
Moreover the JSON representation may contain data sources which should be appended as file attachments to the mail. Then the mail contains the &amp;lt;code&amp;gt;&amp;quot;datasources&amp;quot;&amp;lt;/code&amp;gt; key which is expected to be a JSON array of data source descriptions.&lt;br /&gt;
&lt;br /&gt;
A data source description follows the [[#Module_.22conversion.22_.28preliminary.29 | conversion specification]].&lt;br /&gt;
&lt;br /&gt;
For example to attach a file through an URL the field looks like this (available with v6.18.2):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;from&amp;quot;: &amp;quot;someone@somewhere.com,&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;quot;datasources&amp;quot;&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;identifier&amp;quot;: &amp;quot;com.openexchange.url.mail.attachment&amp;quot;,&lt;br /&gt;
   &amp;quot;args&amp;quot;:&lt;br /&gt;
    {&lt;br /&gt;
     &amp;quot;url&amp;quot;: &amp;lt;url-string&amp;gt;,&lt;br /&gt;
     &amp;quot;timeout&amp;quot;: &amp;lt;optional-timeout-millis-int, default is 2500msec&amp;gt;,&lt;br /&gt;
     &amp;quot;contentType&amp;quot;: &amp;lt;optional-content-type-string&amp;gt;,&lt;br /&gt;
     &amp;quot;charset&amp;quot;: &amp;lt;optional-charset-string&amp;gt;,&lt;br /&gt;
     &amp;quot;size&amp;quot;: &amp;lt;optional-size-int&amp;gt;,&lt;br /&gt;
     &amp;quot;disposition&amp;quot;: &amp;lt;optional-disposition-string&amp;gt;,&lt;br /&gt;
     &amp;quot;fileName&amp;quot;: &amp;lt;optional-file-name-string&amp;gt;,&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created mail.&lt;br /&gt;
&lt;br /&gt;
=== Send/Save mail as MIME data block (RFC822) (added in SP5) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) - In case the mail should not be sent out, but saved in a specific folder, the &amp;quot;folder&amp;quot; parameter can be used. If the mail should be sent out to the recipient, the &amp;quot;folder&amp;quot; parameter must not be included and the mail is stored in the folder &amp;quot;Sent Items&amp;quot;. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. If no &amp;quot;folder&amp;quot;  parameter is specified, this parameter must not be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
 &lt;br /&gt;
Request Body: The MIME Data Block&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created/moved mail.&lt;br /&gt;
&lt;br /&gt;
=== Import of mails as MIME data block (RFC822) (added with 6.18) ===&lt;br /&gt;
&lt;br /&gt;
This request can be used to store a single or a lot of mails in the OX mail storage backend. This action should be used instead of &amp;lt;code&amp;gt;action=new&amp;lt;/code&amp;gt; because it is faster and tolerant to 8bit encoded emails.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /ajax/mail?action=import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - For the import this parameter is required to specify the folder into that the emails should be imported. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
*&amp;lt;code&amp;gt;force&amp;lt;/code&amp;gt; (optional) - If this parameter is set to true, the server skips checking the valid From-address&lt;br /&gt;
 &lt;br /&gt;
Request Body: A multipart/form-data with a single or multiple file parts each having a different name and containing the RFC822 encoded email as binary data like in a file upload.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the folder identifier and the object identifier of the imported mail or a JSON array of those JSON objects if multiple mails are imported.&lt;br /&gt;
&lt;br /&gt;
=== Reply/Forward a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=forward&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested Message.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP6) - &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML. &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).'''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;setFrom&amp;lt;/code&amp;gt; (optional - available since v7.6.0) A flag (&amp;quot;true&amp;quot;/&amp;quot;false&amp;quot;) that signals if &amp;quot;From&amp;quot; header shall be pre-selected according to a suitable recipient address that matches one of user's E-Mail address aliases; only supported for &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included.&lt;br /&gt;
&lt;br /&gt;
=== Delete mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects providing folder IDs and object IDs of the deleted mails.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/INBOX&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;123&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/MyFolder&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;134&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not IMAP: Response: An array with object IDs of mails which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Clear mail folder(s) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=clear&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with IDs of the mail folders to clear&lt;br /&gt;
&lt;br /&gt;
Response: An array with IDs of mail folder that could not be cleared; meaning the response body is an empty JSON array if everything went well.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge receipt ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=receipt_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the &amp;quot;from address&amp;quot;, the id of the folder and the mail id: e.g.: {&amp;quot;from&amp;quot;:&amp;quot;mymail@domain.com&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;1234&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object with an empty data field if everything went well or a JSON object containing the error information.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;groups&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The group module allows to query available groups. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get a group ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The group id.&lt;br /&gt;
&lt;br /&gt;
Response: A group object as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== List groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with group identifiers.&lt;br /&gt;
&lt;br /&gt;
Response: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== Search for groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#GroupSearch | Group search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find groups. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group data&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name         || String || Name with character restrictions&lt;br /&gt;
|-&lt;br /&gt;
| members       || Array  || The array contains identifier of users that are member of the group.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created group.&lt;br /&gt;
&lt;br /&gt;
=== Delete a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the group to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the group.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the group was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the group to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the group to update. If the group was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested groups.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted groups. New, modified and deleted groups are represented by JSON objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;resource&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The resource module allows to query available resources. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get all resources ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource identifier.&lt;br /&gt;
&lt;br /&gt;
=== List resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An array with resources ids.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Get a resource ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The resource id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Search for resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#ParticipantSearch | Participant search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ParticipantSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find resources. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResourceResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Resource Response&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name || String || internal name&lt;br /&gt;
|-&lt;br /&gt;
| mailaddress || String || email address&lt;br /&gt;
|-&lt;br /&gt;
| availability || Boolean || can be false to mark the resource currently unavailable&lt;br /&gt;
|-&lt;br /&gt;
| description || String || description of the resource&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified_utc || Timestamp || Date and time of the last modification.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: An object with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created resource.&lt;br /&gt;
&lt;br /&gt;
=== Delete a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resource was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Delete resources (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resources were deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the resource to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the resource to update. If the resource was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested resources.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted resources. New, modified and deleted resources are represented by JSON objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;infostore&amp;quot; or &amp;quot;Filestore&amp;quot; or &amp;quot;Files&amp;quot; or &amp;quot;Drive&amp;quot; ==&lt;br /&gt;
This module has been renamed quite often. Whatever its name, it combines the knowledge database, bookmarks and document storage.&lt;br /&gt;
&lt;br /&gt;
=== Get all infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedInfoitemData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed infoitem data&lt;br /&gt;
! ID  !! Name            !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 108 || object_permissions           || Array  || Each element is an object described in [[#ObjectPermissionObject | Object Permission object]] (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 109 || shareable       || Boolean || (read-only) Indicates if the item can be shared (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 700 || title           || String  || Title&lt;br /&gt;
|-&lt;br /&gt;
| 701 || url             || String  || Link/URL&lt;br /&gt;
|-&lt;br /&gt;
| 702 || filename        || String  || Displayed filename of the document.&lt;br /&gt;
|-&lt;br /&gt;
| 703 || file_mimetype   || String  || MIME type of the document. The client converts known types to more readable names before displaying them.&lt;br /&gt;
|-&lt;br /&gt;
| 704 || file_size       || Number  || Size of the document in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 705 || version         || Number  || Version number of the document. New documents start at 1. Every update increments the version by 1.&lt;br /&gt;
|-&lt;br /&gt;
| 706 || description     || String  || Description&lt;br /&gt;
|-&lt;br /&gt;
| 707 || locked_until    || Time    || The time until which this item will presumably be locked. Only set if the docment is currently locked, 0 otherwise.&lt;br /&gt;
|-&lt;br /&gt;
| 708 || file_md5sum     || String  || MD5Sum of the document. Not yet implemented, so this is currently always empty.&lt;br /&gt;
|-&lt;br /&gt;
| 709 || version_comment || String  || A version comment is used to file a changelog for the file.&lt;br /&gt;
|-&lt;br /&gt;
| 710 || current_version || Boolean || “true” if this version is the current version “false” otherwise. Note: This is not writeable&lt;br /&gt;
|-&lt;br /&gt;
| 711 || number_of_versions || Number || The number of all versions of the infoitem. Note: This is not writeable.&lt;br /&gt;
|-&lt;br /&gt;
| 7010 || com.openexchange.share.extendedObjectPermissions || Array || Each element is an object described in [[#ExtendedObjectPermissionObject | Extended object permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 7020 || com.openexchange.realtime.resourceID || String || The resource identifier for the infoitem for usage within the realtime component. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies.&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user.&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended object permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || The numerical value indicating no object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || The numerical value indicating read object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || The numerical value indicating write object permissions. This implicitly includes the “read” permission (this is no bitmask).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of requested infoitems.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted infoitems. New and modified infoitems are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted infoitems (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested infoitem. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Search infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields as per tables [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; (optional) – The start index (inclusive) in the ordered search, that is requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; (optional) – The last index (inclusive) from the ordered search, that is requested.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchContacts | Search contacts]].&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem document ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt;(optional) – If present the response declares the given content_type in the Content-Type header.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem or the content_type given.&lt;br /&gt;
&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get a ZIP archive containing the infoitems of a denoted folder (available with v7.6.1) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=zipfolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;recursive&amp;lt;/code&amp;gt; – &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to also include subfolders and their infoitems respectively; otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to only consider the infoitems of specified folder&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP archive. The response type for the HTTP Request is set to &amp;lt;code&amp;gt;application/zip&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Get all versions ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=versions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem whose versions are requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. The timestamp is the timestamp relating to the requested infostore item.&lt;br /&gt;
&lt;br /&gt;
=== Check if file name is valid (since 7.8.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=checkname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – Name of the file to check.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple documents as a ZIP archive (available with v7.4.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=zipdocuments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; – A URL-encoded JSON array; see below for details&lt;br /&gt;
&lt;br /&gt;
Parameter &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;: A JSON array of JSON object tuples specifying the documents' versions to include in the requested ZIP archive; e.g&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[{&amp;quot;id&amp;quot;:&amp;quot;61820&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;61821&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;}]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The field &amp;lt;code&amp;gt;&amp;quot;version&amp;quot;&amp;lt;/code&amp;gt; is optional; if missing it refers to latest/current version.&amp;lt;br&amp;gt;&lt;br /&gt;
So, a valid parameter would look like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;body=%5B%7B%22id%22%3A%2261820%22%2C%22folder%22%3A%2270303%22%7D%2C%7B%22id%22%3A%2261821%22%2C%22folder%22%3A%2270303%22%2C%22version%22%3A%221%22%7D%5D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The download offer for the requested ZIP archive containing specified document versions&lt;br /&gt;
&lt;br /&gt;
=== Move one or more infoitems via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=move&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the destination folder.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array consisting of JSON objects each referencing to an existing infoitem that is supposed to be moved to the destination folder&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36639&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;},&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36641&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array consisting of those identifiers that could not be moved (due to a conflict) or an empty JSON array if everything went fine&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; – Optionally sets the start offset in bytes where to append the data to the document, must be equal to the actual document's length (available with v7.8.1). Only available if the underlying [[#FileStorageAccount | File storage account]] supports the &amp;quot;RANDOM_FILE_ACCESS&amp;quot; capability.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem. The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Save an attachment in the infostore ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=saveAs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object with the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;Attachment&amp;lt;/code&amp;gt; – The id of the attachement to save.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. The fields in this infoitem object override values from the attachment. The folder_id must be given. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Delete infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the file is deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the file is not yet located below the trash folder, it is moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects to delete. The fields for the object are described in [[#FullIdentifierForAnInfostoreDocument|Full identifier for an infostore document]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with [[]]. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnInfostoreDocument&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an infostore document&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || Folder ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: A List of arrays with the version numbers of the infoitems to detach.&lt;br /&gt;
&lt;br /&gt;
Response: An array with version numbers that were not deleted.&lt;br /&gt;
&lt;br /&gt;
Note: When the current version of a document is deleted the new current version will be the newest version.&lt;br /&gt;
&lt;br /&gt;
=== Delete all versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=revert&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Removes all versions of the infostore document leaving only the base object.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
Response: The id of the newly created object&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Lock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=lock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be locked.&lt;br /&gt;
* &amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt; (optional) – If present the value is added to the current time on the server (both in ms). The document will be locked until that time. If this parameter is not present, the document will be locked for a duration as configured on the server.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only include errors.&lt;br /&gt;
&lt;br /&gt;
=== Unlock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=unlock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be unlocked.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only contain errors.&lt;br /&gt;
&lt;br /&gt;
=== Get shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared infoitem to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;Attachments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Attachment Module allows file attachments to arbitrary objects. An Attachment always belongs to an object (called 'attached') in a certain folder of a certain module.  &lt;br /&gt;
&lt;br /&gt;
=== Get All Attachments for an Object ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachment's are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of attachments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Create an Attachment ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/attachment?action=attach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json_[index]&amp;lt;/code&amp;gt; – The JSON representation of an attachment object as described in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;file_[index]&amp;lt;/code&amp;gt; – The file metadata as per &amp;lt;input type=file /&amp;gt; upload.&lt;br /&gt;
&lt;br /&gt;
Note: The JSON Object and file fields describe the corresponding attachment. For ex.: json_0 contains metadata for file_0, json_1 for file_1 and so on. Indexes start with 0.&lt;br /&gt;
&lt;br /&gt;
Request body: multipart/form-data or multipart/mixed containing the file data of the attached file and the above fields.&lt;br /&gt;
&lt;br /&gt;
Response: HTML page with javascript callback as per introduction. Contains a JSON-Array of ids of the newly created attachments. The order of the ids corresponds to the indexes in the request.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AttachmentObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment Object&lt;br /&gt;
! ID  !! Name          !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 800 || folder        || Number  || The ID of the first Folder in which the attached object resides.&lt;br /&gt;
|-&lt;br /&gt;
| 801 || attached      || Number  || The object id of the object this attachement is attached to.&lt;br /&gt;
|-&lt;br /&gt;
| 802 || module        || Number  || The Module of this Object Possible Values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1   || Appointment&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Task&lt;br /&gt;
|-&lt;br /&gt;
| 7   || Contact&lt;br /&gt;
|-&lt;br /&gt;
| 137 || Infostore&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 803 || filename      || String  || The filename of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 804 || file_size     || Number  || The file size (in bytes) of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 805 || file_mimetype || String  || The MIME-Type of the attached file&lt;br /&gt;
|-&lt;br /&gt;
| 806 || rft_flag      || Boolean || If the attachment is a RTF Attachment of Outlook. (Outlook descriptions can be stored as RTF Documents).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete Attachment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ids of the attachments to delete.&lt;br /&gt;
&lt;br /&gt;
=== Get updated attachments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
ignore (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new and deleted attachments for the specified object. New attachments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted attachments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain numbers, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attahment?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested attachment. The fields of the object are listed in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]]. &lt;br /&gt;
&lt;br /&gt;
=== Get an attachments filedata ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; (optional) – If set the responses Content-Type header is set to this value, not the attachements file mime type.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem.&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;reminder&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The reminder module provides the ability to fetch all active reminders for a user between two dates.&lt;br /&gt;
&lt;br /&gt;
=== Get reminder range ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/reminder?action=range&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The End date of the reminder range&lt;br /&gt;
&lt;br /&gt;
Response: An Array with all reminders which are scheduled until the specified time. Each reminder is described in [[#ReminderResponse | Reminder response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ReminderResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Reminder response&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The ID of the reminder.&lt;br /&gt;
|-&lt;br /&gt;
| target_id || Number || The target_id where this reminder is attached to&lt;br /&gt;
|-&lt;br /&gt;
| alarm     || Time   || The time of the alarm&lt;br /&gt;
|-&lt;br /&gt;
| module    || Number || The module of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| servertime || Time || The time on the server&lt;br /&gt;
|-&lt;br /&gt;
| user_id || Number || The ID of the user.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || The last modification timestamp of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| recurrence_position || Number || The recurrence position for series appointments or 0 if no series&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || The ID of the folder through that the object can be read&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete a Reminder===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the id that was not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete Reminders (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the ids that were not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Remind again (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=remindAgain&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the reminder whose date shall be changed.&lt;br /&gt;
&lt;br /&gt;
Request body: The JSON representation of the reminder; mainly containing the field “alarm” which provides the new reminder date.&amp;lt;br&amp;gt;&lt;br /&gt;
E.g. &amp;lt;code&amp;gt;{ &amp;quot;alarm&amp;quot;: 1283418027381 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response body: The JSON representation of the updated reminder.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;multiple&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The multiple module allows to bundle multiple requests to most other modules in a single request. Not supported are:&lt;br /&gt;
* modules login and multiple,&lt;br /&gt;
* POST requests with a multipart encoding (uploads),&lt;br /&gt;
* GET requests which do not use an object as described in [[#ResponseBody | Response body]] as response body (downloads).&lt;br /&gt;
&lt;br /&gt;
=== Multiple requests ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/multiple&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;continue&amp;lt;/code&amp;gt; – Specifies whether processing of requests should stop when an error occurs, or whether all request should be processed regardless of errors.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with request objects. Each request object contains all URI parameters of the &amp;quot;normal&amp;quot; request as fields. The module name of the &amp;quot;normal&amp;quot; request is included in the field module. The parameter session is not included. If the &amp;quot;normal&amp;quot; request has a request body, the object which is represented by that request body is includes as the value of the field data.&lt;br /&gt;
&lt;br /&gt;
Response: An array with reply objects as described in [[#ResponseBody | Response body]]. The order of reply objects corresponds to the order of requests in the request body. Unlike with all other modules, this response is itself not part of a response object as described in [[#ResponseBody | Response body]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;quota&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The filestore module allows accesssing information about the use and quota of the filestore.&lt;br /&gt;
&lt;br /&gt;
=== Get quota information (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; (optional) – The module identifier to get quota information for, required if &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; is set.&lt;br /&gt;
* &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; (optional) – The account identifier within the module to get quota information for.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the requested quota information. If no &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was specified, all defined [[#ModuleQuota | module quotas]] are set in the JSON object, each one mapped to it's module identifier. If the quota from a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was requested, a JSON array containing all [[#AccountQuota | account quotas]] of this module are returned. If both a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; were requested, a JSON object representing this specific [[#AccountQuota | account auota]] is returned. &lt;br /&gt;
&lt;br /&gt;
Note: In case there is no quota limitation defined for a module or account, no corresponding JSON object is included in the response. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ModuleQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Module Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || The display name of the module&lt;br /&gt;
|-&lt;br /&gt;
| accounts|| Array || Each element identifies an account quota within the module, as described in [[#AccountQuota | Account Quota]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AccountQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Account Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| account_id || String || Identifier of the account&lt;br /&gt;
|-&lt;br /&gt;
| account_name || String || Name of the account&lt;br /&gt;
|-&lt;br /&gt;
| countquota || Number || The account's quota limit for the number of items, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| countuse || Number || The account's actual usage for the number of items, or not set if no count quota defined&lt;br /&gt;
|-&lt;br /&gt;
| quota || Number || The account's quota limit for the storage in bytes, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The account's actual usage for the storage in bytes, or not set if no storage quota defined&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get the filestore usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=filestore&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the uploaded files sizes sum and the field “quota” represents the maximum.&lt;br /&gt;
&lt;br /&gt;
=== Get the mail usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the use mail quota and the field “quota” represents the maximum. -1 represents an unlimited quota.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;import&amp;quot;==&lt;br /&gt;
The module import allows to import specific module data (like Contacts, Tasks or Appointments) in several formats (iCal, vCard, CSV) into a folder. Please note: The callback for all actions of this bundle is callback_import, not callback_$actionname for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
=== Import CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: A &amp;quot;multipart/form-data&amp;quot; encoded .CSV file. The field name for the file is &amp;quot;file&amp;quot;. The column titles of the table are those used within the OX, see column ''Displayed Name'' in [[#DetailedContactData]].&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import Outlook CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=OUTLOOK_CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: An .CSV file with Windows' default encoding Windows-1252. The column titles of the table may be those used by the English, French or German version of Outlook.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import iCAL ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This may be an Appointment or a Task folder. May even be a list containing both.&lt;br /&gt;
* &amp;lt;code&amp;gt;suppressNotification&amp;lt;/code&amp;gt; – This optional parameter can be used to disable the notifications for new appointments that are imported through the given iCal file. This help keeping the Inbox clean if a lot of appointments need to be imported. The value of this parameter does not matter because only for the existence of the parameter is checked.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignoreUIDs&amp;lt;/code&amp;gt; – Optional. When set to &amp;quot;true&amp;quot;, UIDs are partially ignored during import of tasks and appointments from iCal. Internally, each UID is replaced statically by a random one to preserve possibly existing relations between recurring appointments in the same iCal file, but at the same time to avoid collisions with already existing tasks and appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An iCalendar file.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered, and warnings (under the key &amp;quot;warnings&amp;quot;) containing an Array of objects with the warning data, containing all customary error fields.&lt;br /&gt;
&lt;br /&gt;
=== Import vCard ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An vCard file, maybe of the formats: vCard 2.1, vCard 3.0 or vCalendar 1.0&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;export&amp;quot; ==&lt;br /&gt;
The module export allows to export specific module data (like Contacts, Tasks or Appointments) from a folder in several formats (iCal, vCard, CSV).&lt;br /&gt;
&lt;br /&gt;
=== Exporting CSV ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – (optional) Columns to be imported from the given file, given as an array of column numbers. See [[#DetailedContactData | Detailed contact data]] for numbers.&lt;br /&gt;
* &amp;lt;code&amp;gt;export_dlists&amp;lt;/code&amp;gt; – (optional) toggles whether distribution lists are exported, too. Default is false. Option exists since 7.4.1.&lt;br /&gt;
Response: An InputStream containing the file of the MIME type &amp;lt;code&amp;gt;text/csv&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting iCAL ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Calendar folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/calendar&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting vCard ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/x-vcard&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;sync&amp;quot; ==&lt;br /&gt;
The module sync delivers several core API extensions to support common operations used in a mobile synchronization environment.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/sync?action=refresh_server&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;token&amp;quot; (since 7.4.0) ==&lt;br /&gt;
The module token delivers several core API extensions to support token based logins.&lt;br /&gt;
&lt;br /&gt;
=== Get a login token ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/token?action=acquireToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON object with the timestamp of the creation date and a token which can be used to create a new session.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mailfilter&amp;quot; ==&lt;br /&gt;
The module mailfilter describes how to add, update or delete mail filter rules or to check which actions are supported by the underlying system.&lt;br /&gt;
&lt;br /&gt;
A detailed description can be found here [[ HTTP_API_MailFilter | Mail Filter HTTP API]]&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;ajax file upload&amp;quot; ==&lt;br /&gt;
This module offers to store files in server's dedicated download directory for a configureable amount of time. The files are then accessible for further operations like inline images in (html) mails&lt;br /&gt;
&lt;br /&gt;
=== Uploading a file ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/file?action=new&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The module for which the file is uploaded to determine proper upload quota constraints (e.g. &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;, etc.).&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; – The file type filter to define which file types are allowed during upload. Currently supported filters are: &amp;lt;code&amp;gt;file=all, text=text/*, media=image OR audio OR video, image=image/*, audio=audio/*, video=video/*, application=application/*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A common POST request body of MIME type &amp;quot;multipart/*&amp;quot; which holds the file(s) to upload&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of the uploaded files. The files are accessible through the returned IDs for future use.&lt;br /&gt;
&lt;br /&gt;
=== Updating a file's last access timestamp (keep alive) ===&lt;br /&gt;
By updating the last access timestamp it's prevented from being deleted from both session and disk storage.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=keepalive&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file whose timestamp should be updated&lt;br /&gt;
&lt;br /&gt;
Response: The string &amp;quot;null&amp;quot; in response's data element&lt;br /&gt;
&lt;br /&gt;
=== Requesting a formerly uploaded file ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested file is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;image&amp;quot; ==&lt;br /&gt;
This module allows to download images from Open-Xchange server without providing a session ID in request's URL parameters.&lt;br /&gt;
&lt;br /&gt;
=== Requesting an image ===&lt;br /&gt;
Open-Xchange Server supports multiple image sources that are identified through request's path identifier&lt;br /&gt;
&lt;br /&gt;
* Inline images from mails&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mail/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Contact profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/contact/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* User profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/user/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* MP3 cover image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/file/mp3cover&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Fetch a previously uploaded image using &amp;lt;code&amp;gt;&amp;quot;/ajax/file&amp;quot;&amp;lt;/code&amp;gt; interface&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mfile/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each image source requires an individual set of required parameters&lt;br /&gt;
&lt;br /&gt;
==== Inline images from mails ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/mail/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;accountId&amp;lt;/code&amp;gt; – The mail account identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the mail resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The mail identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the image inside the referenced mail&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Contact profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/contact/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the contact resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The contact identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== User profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/user/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The user identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MP3 cover image ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/file/mp3cover&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Managed Image File ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/image/mfile/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;conversion&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
A generic module to request data from a data source and to process obtained/submitted data with a data handler. Thus data is converted from a data source by a data handler.&lt;br /&gt;
&lt;br /&gt;
=== Converting data ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
or&amp;lt;br&amp;gt;&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters: &amp;amp;lt;no parameters required&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A [[#ConversionRequest | conversion request]] JSON object containing nested JSON objects for [[#DataSource | data source]] and [[#DataHandler | data handler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConversionRequest&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Conversion request object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| datasource || JSON object || The data source object.&lt;br /&gt;
|-&lt;br /&gt;
| datahandler || JSON object || The data handler object.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSource&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data source object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data source.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data source&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataHandler&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data handler object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data handler.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data handler&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: The result of converted data ready as an appropriate JSON response&lt;br /&gt;
&lt;br /&gt;
==== Saving an ICal email attachment ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can be saved as appointments and tasks into given calendar and task folder.&lt;br /&gt;
If the fields &amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;quot; and &amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;quot; are set, the data handler inserts the appointment with the given status for the user, if the appointment does not exist. If it is already existing, the handler just updates the participant status.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;calendar-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.task.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;task-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;status&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;message&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added appointment/task; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Converting an ICal email attachment into JSON objects ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can converted to JSON appointments and tasks.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Note''' that all arguments are optional: Default is user time zone and zero recurrence position&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;com.openexchange.groupware.calendar.searchobject&amp;quot; triggers a search for the uid, and replaces the object_id and folder_id with the data of the corresponding ox-object id, if existing. The returned objects are still the ical objects and NOT the ox-objects.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical.json&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.timezone&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;timezone-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.recurrencePosition&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;recurrence-position&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.searchobject&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;true|false&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects for each appointment/task as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]/[[##DetailedAppointmentData | Detailed appointment data]]&lt;br /&gt;
&lt;br /&gt;
==== Saving a VCard email attachment ====&lt;br /&gt;
&lt;br /&gt;
If a VCard file is attached to an email, its content can be saved as contacts into given contact folder.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.contact.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;contact-folder-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added contact; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contact(s) attached to a new email as a VCard file ====&lt;br /&gt;
&lt;br /&gt;
Obtain VCard data from specified contact object(s).&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-id1&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;id1&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-idn&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;idn&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Get a new email's JSON object with specified VCard data source attached.&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:[]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A [[#DetailedMailData | mail]] JSON object.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:{search-term-object}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&amp;lt;br&amp;gt;&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[...]}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moreover there are two different types of a search terms:&lt;br /&gt;
* A single search term&lt;br /&gt;
* A composite search term&lt;br /&gt;
&lt;br /&gt;
A single search term reflects an operation which cannot hold nested search terms as operands; e.g. &amp;quot;equals&amp;quot;. In opposite to this a composite search term holds one or more nested search terms as operands; e.g. &amp;quot;not&amp;quot; or the logical junctors &amp;quot;and&amp;quot;/&amp;quot;or&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
By now the following operations are supported:&lt;br /&gt;
* composite operations&lt;br /&gt;
** &amp;quot;and&amp;quot; - The AND junctor&lt;br /&gt;
** &amp;quot;or&amp;quot; - The OR junctor&lt;br /&gt;
** &amp;quot;not&amp;quot; - Negation&lt;br /&gt;
* single operations&lt;br /&gt;
** &amp;quot;equals&amp;quot; - Equals comparison&lt;br /&gt;
** &amp;quot;lt&amp;quot; - Less-than comparison&lt;br /&gt;
** &amp;quot;gt&amp;quot; - Greater-than comparison&lt;br /&gt;
&lt;br /&gt;
Furthermore following operand types are supported for single search terms:&lt;br /&gt;
* Column - Providing a name referring to a field/column&lt;br /&gt;
* Constant - A constant&lt;br /&gt;
&lt;br /&gt;
Example of an EQUALS search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of an OR search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;or&amp;quot;,&amp;quot;operands&amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;gt&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;birthday&amp;quot;},&amp;quot;1975-05-01&amp;quot;]}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Refer to object data tables introduced by different modules to know which field names are supported; e.g. for tasks it is [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]], and [[#DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (alternative suggestion, still preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:&amp;lt;i&amp;gt;[search term]&amp;lt;/i&amp;gt;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[&amp;quot;&amp;gt;&amp;quot;, 5, 2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The available operators are:&lt;br /&gt;
* Comparison operators &amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;=&amp;quot;, &amp;quot;&amp;lt;=&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
* logic operators &amp;quot;not&amp;quot;, &amp;quot;and&amp;quot;, &amp;quot;or&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Comparison operators have exactly two operands. Each operand can be either a field name or a constant. A field name is an object with the member &amp;quot;field&amp;quot; specifying the field name, e.g. &amp;lt;code&amp;gt;{ field: &amp;quot;first_name&amp;quot; }&amp;lt;/code&amp;gt;. The available field names depend on the searched module. Primitive JSON types are interpreted as constants. Arrays are not valid operands for comparison operators.&lt;br /&gt;
&lt;br /&gt;
The logic operator &amp;quot;not&amp;quot; has exactly one operand, the other logic operators can have any number of operands. Each operand must be an array representing a nested search expression.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail account&amp;quot; (available with v6.12) ==&lt;br /&gt;
&lt;br /&gt;
The mail account module is used to manage multiple mail accounts held by a user.&lt;br /&gt;
&lt;br /&gt;
=== Get All mail accounts  ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mail account's are defined in [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one mail account and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail account ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the account to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the desired mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MailAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Mail account data&lt;br /&gt;
! ID    !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  1001   || id            || Number  || Account ID&lt;br /&gt;
|-&lt;br /&gt;
|  1002   ||  login    || String  || The login.&lt;br /&gt;
|-&lt;br /&gt;
|  1003   ||  password   || String  || The (optional) password.&lt;br /&gt;
|-&lt;br /&gt;
|  1004   ||  mail_url || String    || The mail server URL; e.g. &amp;quot;imap://imap.somewhere.com:143&amp;quot;. '''URL is preferred over single fields''' (like mail_server, mail_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|  1005   ||  transport_url || String    || The transport server URL; e.g. &amp;quot;smtp://smtp.somewhere.com:25&amp;quot;. '''URL is preferred over single fields''' (like transport_server, transport_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|   1006  ||  name || String    || Account's display name.&lt;br /&gt;
|-&lt;br /&gt;
|  1007   ||  primary_address || String    || User's primary address in account; e.g. &amp;quot;someone@somewhere.com&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|  1008   ||  spam_handler || String    || The name of the spam handler used by account.&lt;br /&gt;
|-&lt;br /&gt;
|   1009  ||  trash || String    || The name of the default trash folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1010   ||  sent || String    || The name of the default sent folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1011  ||  drafts || String    || The name of the default drafts folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1012   ||  spam || String    || The name of the default spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1013   ||  confirmed_spam || String    || The name of the default confirmed-spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1014  || confirmed_ham || String    || The name of the default confirmed-ham folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1015  ||  mail_server || String    || The mail server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1016  ||  mail_port || Number    || The mail server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1017  ||  mail_protocol || String    || The mail server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;imap&amp;quot; instead of &amp;quot;imaps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1018  ||  mail_secure || Boolean    || Whether to establish a secure connection to mail server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1019  ||  transport_server || String    || The transport server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1020  ||  transport_port || Number    || The transport server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1021  ||  transport_protocol || String    || The transport server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;smtp&amp;quot; instead of &amp;quot;smtps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1022  ||  transport_secure || Boolean    || Whether to establish a secure connection to transport server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1023  ||  transport_login || String    || The transport login. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1024  ||  transport_password || String    || The transport password. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1025  ||  unified_inbox_enabled || Boolean    || If enabled for Unified INBOX&lt;br /&gt;
|-&lt;br /&gt;
|   1026  ||  trash_fullname || String    || Path to default trash folder. Preferred over &amp;quot;trash&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1027  ||  sent_fullname || String    || Path to default sent folder. Preferred over &amp;quot;sent&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1028  ||  drafts_fullname || String    || Path to default drafts folder. Preferred over &amp;quot;drafts&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1029  ||  spam_fullname || String    || Path to default spam folder. Preferred over &amp;quot;spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1030  ||  confirmed_spam_fullname || String    || Path to default confirmed-spam folder. Preferred over &amp;quot;confirmed_spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1031  ||  confirmed_ham_fullname || String    || Path to default confirmed-ham folder. Preferred over &amp;quot;confirmed_ham&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1032  ||  pop3_refresh_rate || Number    || The interval in minutes the POP3 account is refreshed&lt;br /&gt;
|-&lt;br /&gt;
|   1033  ||  pop3_expunge_on_quit || Boolean    || Whether POP3 messages shall be deleted on actual POP3 account after retrieval or not&lt;br /&gt;
|-&lt;br /&gt;
|   1034  ||  pop3_delete_write_through || Boolean    || If option &amp;quot;pop3_expunge_on_quit&amp;quot; is disabled, this property defines whether a delete in local INBOX also deletes affected message in actual POP3 account&lt;br /&gt;
|-&lt;br /&gt;
|   1035  ||  pop3_storage || String    || The name of POP3 storage provider, default is &amp;quot;mailaccount&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1036  ||  pop3_path || String    || Path to POP3's virtual root folder in storage, default is name of the POP3 account beside default folders&lt;br /&gt;
|-&lt;br /&gt;
|   1037  ||  personal || String    || The customizable personal part of email address&lt;br /&gt;
|-&lt;br /&gt;
|   1038  ||  reply_to || String    || The customizable reply-to email address&lt;br /&gt;
|-&lt;br /&gt;
|   1039  ||  addresses || String    || The comma-separated list of available E-Mail addresses including aliases. !! Only available for primary mail account !!&lt;br /&gt;
|-&lt;br /&gt;
|   1040  ||  meta || JSON data    || Stores arbitrary JSON data as specified by client associated with the mail account&lt;br /&gt;
|-&lt;br /&gt;
|   1041  ||  archive || String    || The name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1042  ||  archive_fullname || String    || The full name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1043  ||  transport_auth || String    || '''Available since v7.6.1''' Specifies the source for mail transport (SMTP) credentials. Possible values: &amp;quot;mail&amp;quot;, &amp;quot;custom&amp;quot;, and &amp;quot;none&amp;quot;.&amp;lt;br&amp;gt;- &amp;quot;mail&amp;quot; signals to use the same credentials as given in associated mail store (IMAP, POP3).&amp;lt;br&amp;gt;- &amp;quot;custom&amp;quot; signals that individual credentials are supposed to be used (fields &amp;quot;transport_login&amp;quot; and &amp;quot;transport_password&amp;quot; are considered).&amp;lt;br&amp;gt;- &amp;quot;none&amp;quot; means the mail transport does not support any authentication mechanism (rare case!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a new mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to create. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the inserted mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object identifiying (field ID is present) and describing the account to update. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the updated mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ID of the mail account to delete.&lt;br /&gt;
&lt;br /&gt;
=== Validate a mail account (which shall be created) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=validate&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; - An optional boolean parameter which indicates whether on successful validation the folder tree shall be returned (NULL on failure) or if set to &amp;quot;false&amp;quot; or missing only a boolean is returned which indicates validation result&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to validate. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: Dependent on optional &amp;quot;tree&amp;quot; parameter a JSON folder object or a boolean value indicating the validation result&lt;br /&gt;
&lt;br /&gt;
The JSON folder object corresponding to [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
Additionally a field &amp;quot;subfolder_array&amp;quot; is added which contains possible subfolders. This field is missing if a folder contains no subfolders.&lt;br /&gt;
&lt;br /&gt;
[[Category: OX6]]&lt;br /&gt;
&lt;br /&gt;
== Module Auto Configuration (since 6.22) ==&lt;br /&gt;
&lt;br /&gt;
=== Get Auto Configuration ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/autoconfig?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; – Email Adress for which a mail configuration will be discovered.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – Corresponding password for the mail account (optional)&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the best available settings for an appropriate mail Server for the given email address. The fields are described in [[#MailAccountData | mail account data]]. The Data may be incomplete or even empty.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user&amp;quot; (available with v6.14) ==&lt;br /&gt;
&lt;br /&gt;
The user module is used to access user information.&lt;br /&gt;
&lt;br /&gt;
=== Get all users ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedUserData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed user data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type       !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 610 || Aliases                     || aliases              || Array      || The user's aliases&lt;br /&gt;
|-&lt;br /&gt;
| 611 || Time zone                   || timezone             || String     || The time zone ID.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || Locale                      || locale               || String     || The name of user's entire locale, with the language, country and variant separated by underbars. E.g. &amp;quot;en&amp;quot;, &amp;quot;de_DE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 613 || Groups                      || groups               || Array      || The IDs of user's groups&lt;br /&gt;
|-&lt;br /&gt;
| 614 || Contact ID                  || contact_id           || Number     || The contact ID of the user&lt;br /&gt;
|-&lt;br /&gt;
| 615 || Login info                  || login_info           || String     || The user's login information&lt;br /&gt;
|-&lt;br /&gt;
| 616 || Guest Created By            || guest_created_by     || Number     || The ID of the user who has created this guest in case this user represents a guest user; it is 0 for regular users (preliminary, available with v7.8.0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of numbers. Each number is the ID of requested user. Since v6.18.1, a &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; value in the array is interpreted as the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a user ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested user. Since v6.18.1, this parameter is optional: the default is the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested user. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a user ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated user.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated user. If the user was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: User object as described in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
'''Note''': &amp;quot;timezone&amp;quot; and &amp;quot;locale&amp;quot; are the only fields from [[#DetailedUserData | Detailed user data]] which are allowed to be updated.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty object.&lt;br /&gt;
&lt;br /&gt;
=== Search users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected users with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchUsers | Search users]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsers&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find users. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search users with the given startletter. If this field is present, the pattern is matched against the user field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchUsersAlternative | Search users alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsersAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches users where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches users where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches users where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, the fields are connected through an OR search habit.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed by connecting the relevant fields through an OR search habit.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=getAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The attribute name. &lt;br /&gt;
&lt;br /&gt;
Response without timestamp: A JSON object providing name and value of the requested attribute&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=setAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;setIfAbsent&amp;lt;/code&amp;gt; - Set to &amp;quot;true&amp;quot; to put the value only if the specified name is not already associated with a value, otherwise &amp;quot;false&amp;quot; to put value in any case&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing name and value of the attribute. If the &amp;lt;code&amp;gt;&amp;quot;value&amp;quot;&amp;lt;/code&amp;gt; field id missing or NULL, the attribute is removed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if PUT was successful; otherwise &amp;quot;false&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user/me&amp;quot; (available with v7.6.2) ==&lt;br /&gt;
&lt;br /&gt;
The user/me module is used to access formal information about current user.&lt;br /&gt;
&lt;br /&gt;
=== Get user information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user/me&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object providing information for current user&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;context_id&amp;quot;: 1234,&lt;br /&gt;
        &amp;quot;user_id&amp;quot;: 5,&lt;br /&gt;
        &amp;quot;is_context_admin&amp;quot;: false,&lt;br /&gt;
        &amp;quot;login_name&amp;quot;: &amp;quot;user5&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;: &amp;quot;User Five&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: 1400855683800&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;OAuth&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Open-Xchange server can act as an OAuth client (starting with v6.20) or be an OAuth provider itself (starting with v7.8.0). The OAuth module supports both aspects:&lt;br /&gt;
&lt;br /&gt;
* Manage multiple OAuth accounts for certain online services for a user. The OAuth mechanism allows the Open-Xchange application to act as behalf of this user using previously obtained access tokens granted by user. The according interface is divided into two parts: Account access and service's meta data access.&lt;br /&gt;
* Manage granted accesses of external services that can access a users data on his behalf, called &amp;quot;grants&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== OAuth account access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service account access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth accounts ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The &amp;lt;b&amp;gt;optional&amp;lt;/b&amp;gt; service meta data identifier. If missing all accounts of all services are returned; otherwise all accounts of specified service are returned&lt;br /&gt;
&lt;br /&gt;
Response: An array with account data. Each array element is a JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
| serviceId     || String   || The identifier of the associated service meta data; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| secret || String || The token secret&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Delete an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Update an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier. May also be provided in request body's JSON OAuth account representation by &amp;lt;code&amp;gt;&amp;quot;id&amp;quot;&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the OAuth account fields to update. See [[#OauthAccountData | OAuth account data]]. Currently the only values which make sende being updated are &amp;lt;code&amp;gt;&amp;quot;displayName&amp;quot;&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;&amp;quot;token&amp;quot;&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;&amp;quot;secret&amp;quot;&amp;lt;/code&amp;gt;-pair.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Initialize creation of an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=init&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The service meta data identifier; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An JSON representation of the resulting interaction providing needed information to complete account creation. See [[#OauthInteractionData | OAuth interaction data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OauthInteractionData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth interaction&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| authUrl || String || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The interaction type name; &amp;lt;code&amp;gt;&amp;quot;outOfBand&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;callback&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| uuid || String || The UUID for this OAuth interaction&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Create an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
Note: This action is typically called by provided call-back URL and is ony intended for manual invocation if &amp;quot;outOfBand&amp;quot; interaction is returned by preceeding &amp;lt;code&amp;gt;/ajax/oauth/account?action=init&amp;lt;/code&amp;gt; step.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=create&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_token&amp;lt;/code&amp;gt; – The request token from preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; – The UUID of the preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_verfifier&amp;lt;/code&amp;gt; – The verifier string which confirms that user granted access&lt;br /&gt;
* &amp;lt;code&amp;gt;displayName&amp;lt;/code&amp;gt; – The display name for the new account&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing the newly created OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
=== OAuth service meta data access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service meta data access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth services' meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array with service data. Each array element is a JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth service's meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The service's identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthServiceMetaData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth service meta data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Manage OAuth grants (available with v7.8.0) ===&lt;br /&gt;
&lt;br /&gt;
==== Get all grants ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/grants?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing one object for every granted access as specified in [[#OAuthGrants | OAuth grants]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthGrants&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth grants&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| client || Object || A JSON object describing the external service as in [[#OAuthClient | OAuth client]].&lt;br /&gt;
|-&lt;br /&gt;
| scopes || Object || A JSON object with mappings from scope tokens to translated, human-readable descriptions for every scope that was granted to the external service. Example: {&amp;quot;read_contacts&amp;quot;:&amp;quot;See all your contacts.&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| date || Time || The time when the access was granted.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthClient&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth client&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The clients ID.&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The clients/services name.&lt;br /&gt;
|-&lt;br /&gt;
| description || String || A description of the client.&lt;br /&gt;
|-&lt;br /&gt;
| website || String || A URL to the clients website.&lt;br /&gt;
|-&lt;br /&gt;
| icon || String || A URL or path to obtain the clients icon via the &amp;quot;image&amp;quot; module.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Revoke access ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;oauth/grants?action=revoke&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - The ID of the client whose access shall be revoked.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;JSlob&amp;quot; (available with v6.22) ==&lt;br /&gt;
&lt;br /&gt;
The JSlob module is used to store&amp;amp;retrieve arbitrary JSON-structured configuration for a single user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all JSLobs ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jslob?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;JSlobData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | JSlob data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String or Number || The identifier of the JSlob.&lt;br /&gt;
|-&lt;br /&gt;
| jslob || JSON object || The JSON configuration.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== List denoted JSLobs ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array of JSlob identifiers; e.g. &amp;lt;code&amp;gt;[ &amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, … ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== Delete a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The JSlob identifier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An empty request body&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Store a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the &amp;quot;path&amp;quot; and &amp;quot;value&amp;quot; of the JSON configuration to store. If &amp;quot;path&amp;quot; is missing the current configuration&lt;br /&gt;
is merged with given JSON object.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Update a single value inside a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: The new value to store inside specified JSlob&lt;br /&gt;
&lt;br /&gt;
Response: A JSlob representation according to [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== REST-like access to JSlob module ===&lt;br /&gt;
&lt;br /&gt;
to be done...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;freebusy&amp;quot; (available with v6.22.1) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to free/busy information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get free/busy information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/freebusy?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;participant&amp;lt;/code&amp;gt; – The participant to get the free/busy data for. May be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Response: An array of free/busy intervals as described in [[#FreeBusyInterval | Free/Busy interval]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FreeBusyInterval&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Free/Busy interval&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| start_date  || Time       || Start time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| end_date    || Time       || End time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number     || The busy status of this interval, one of:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| id          || String     || Object ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id   || String     || Folder ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| title       || String     || Title of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| location    || String     || Location of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean    || True if the corresponding appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a list of free/busy information ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/freebusy?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of participants to get the free/busy data for. Each participant may be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
&lt;br /&gt;
Response: The free/busy data for all requested participants inside a JSON object with the participants as keys. Besides a combined data element for a requested group, all group members are resolved and listed seperately in the result. If the 'merged' view was requested, an additional data element named 'merged' representing a combined view for all requested participants is added to the results implicitly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Services ==&lt;br /&gt;
&lt;br /&gt;
Messaging Services represent a messaging backend. The messaging services add a new folder module &amp;quot;messaging&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
A *Messaging Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a messagingService. Usually a String in reverse domain name notation. Example: &amp;quot;com.openexchange.messaging.twitter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Twitter&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| formDescription || Array      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
| messagingActions || Array     || An array of Strings a dynamic set of actions that are possible with messages of this service. Described in detail later on. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of messaging service objects. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the messaging service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a messaging service object.&lt;br /&gt;
&lt;br /&gt;
== Messaging Accounts ==&lt;br /&gt;
&lt;br /&gt;
A messaging account represents the concrete configuration of an account of a given messaging service.&lt;br /&gt;
A *messaging account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number      || Identifies a given messaging account. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| messagingService || String  || The messaging service id of the messaging service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant messagingService &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;messagingService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* messagingService - (optional) list only those accounts that belong to the given messagingService.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Messages ==&lt;br /&gt;
&lt;br /&gt;
A Messaging Message represents a single message. It consists of some metadata, headers and a content. The content attribute varies by the content-type header. &lt;br /&gt;
If the content type is text/* it is a string, if it is a multipart/* it is an array of objects, each representing a part of the multipart. If it is anything else&lt;br /&gt;
it is considered binary and is a Base64 encoded string (ToDo : This is not smart enough yet. I suppose we'll have to include encoding options for binaries much like in our EAVJSONProposal).&lt;br /&gt;
&lt;br /&gt;
The folder id of a message follows a predefined format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[messagingService]://[accountId]/[path]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for an imaginary example consider: &amp;quot;com.openexchange.messaging.twitter://535/defaultTimeline/directMessages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The structure of a Messaging Message is as follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Message&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|id            ||String       || The id of this message. Only unique in the given folder. &lt;br /&gt;
|-&lt;br /&gt;
|folder        ||String       || The folder id. &lt;br /&gt;
|-&lt;br /&gt;
|threadLevel   ||Number       || The nesting level of this message according to the conversation it's belonged to. May not be set. &lt;br /&gt;
|-&lt;br /&gt;
|flags         ||Number       || Bitmask showing the state of this message. The same as in the module &amp;quot;mail&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|receivedDate  ||Time         || The time this message was received. &lt;br /&gt;
|-&lt;br /&gt;
|colorLabel    ||Number       || An arbitrary number marking this message in a certain color. The same as the colorLabel common to all groupware objects (see HTTP API)&lt;br /&gt;
|-&lt;br /&gt;
|user          ||Array        || An array of strings. Represents user flags. &lt;br /&gt;
|-&lt;br /&gt;
|size          ||Number       || The binary size of this message in bytes. &lt;br /&gt;
|-&lt;br /&gt;
|picture    || String       || A string depicting the URL to a picture for this message &lt;br /&gt;
|-&lt;br /&gt;
|url           || String      || A string that contains a link to the messages origin. Currently used in RSS messages.&lt;br /&gt;
|-&lt;br /&gt;
|headers       ||JSONObject   || A JSON Object of header data. Usually the value is either a String or an Array (if the headers has more than one value). Certain headers are rendered as more complex structures, see the section &amp;quot;Complex Headers&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|content       ||String or Array || See introductory note for Messaging Messages. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The structure of a Multipart Part (an element of the content array in a multipart/* message) is a s follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Multipart Element&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|sectionId     || String       || The sectionId of this part.&lt;br /&gt;
|-&lt;br /&gt;
|headers       || JSONObject   || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|content       || String or Array || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some *Complex Headers* have a structure differing from simple key/value(s) pairs. These are:&lt;br /&gt;
&lt;br /&gt;
=== Content-Type ===&lt;br /&gt;
&lt;br /&gt;
The Content-Type header is represented as a JSON Object with the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Content Type Header&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| type         || String          || The type string (eg. text/plain). This governs the rendering of the content of a message. &lt;br /&gt;
|-&lt;br /&gt;
| params       || Object          || An Object with the keys &amp;quot;charset&amp;quot;, containing the charset of this message and &amp;quot;name&amp;quot; pointing to the filename this part or message should have. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting the content-type header in a messaging messages generated on the client the header may also be sent in it's short form. The short form is the type followed by a semi-colon separated list of key=value pairs&lt;br /&gt;
of the params. For example: &amp;quot;text/plain;charset=utf-8;name=something.txt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Address Headers ===&lt;br /&gt;
&lt;br /&gt;
Address headers ( From, To,Cc,Bcc,Reply-To,Resent-Reply-To,Disposition-Notification-To,Resent-To,Sender,Resent-Sender,Resent-To,Resent-Cc,Resent-Bcc ) are formatted as an array of objects, or in case of &amp;quot;From&amp;quot; as a single object, with the attributes *address* and *personal*:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Address Headers&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| address         || String     || The technical part of the address&lt;br /&gt;
|-&lt;br /&gt;
| personal       || String      || A displayable description of the addressee. May be unset.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting an address header the header may also be sent by clients in the short form &amp;lt;code&amp;gt;&amp;quot;personal &amp;amp;lt;address&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;&amp;quot;Clark Kent &amp;amp;lt;clark.kent@dailyplanet.com&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== List renderings of Messaging Messages ===&lt;br /&gt;
&lt;br /&gt;
Actions returning lists of messages usually return only a selection of attributes of a message driven by a &amp;quot;columns&amp;quot; parameter. The columns that are addressable point either to attributes of the top-level message or its headers. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Header Equivalence&lt;br /&gt;
! Column     !! Refers To&lt;br /&gt;
|-&lt;br /&gt;
|   *column*    |     *refers to*     &lt;br /&gt;
|-&lt;br /&gt;
| id            || The id attribute    &lt;br /&gt;
|-&lt;br /&gt;
| folderId      || The folder attribute &lt;br /&gt;
|-&lt;br /&gt;
| contentType   || The &amp;quot;Content-Type&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| from          || The &amp;quot;From&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| to            || The &amp;quot;To&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| cc            || The &amp;quot;Cc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| bcc           || The &amp;quot;Bcc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| subject       || The &amp;quot;Subject&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| size          || The size attribute &lt;br /&gt;
|-&lt;br /&gt;
| sentDate      || The &amp;quot;Date&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| receivedDate  || The receivedDate attribute &lt;br /&gt;
|-&lt;br /&gt;
| flags         || The flags attribute &lt;br /&gt;
|-&lt;br /&gt;
| threadLevel   || The threadLevel attribute &lt;br /&gt;
|-&lt;br /&gt;
| dispositionNotificationTo || The &amp;quot;Disposition-Notification-To&amp;quot; header. &lt;br /&gt;
|-&lt;br /&gt;
| priority      || The &amp;quot;X-Priority&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| colorLabel    || The colorLabel attribute &lt;br /&gt;
|-&lt;br /&gt;
| url             || The url attribute &lt;br /&gt;
|-&lt;br /&gt;
| body          || The content attribute &lt;br /&gt;
|-&lt;br /&gt;
| headers       || The headers attribute &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== JSON calls ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* id - The ID of the message to load&lt;br /&gt;
* peek - (optional) if set to &amp;quot;true&amp;quot; the read/unread state of the message will not change. Defaults to false.&lt;br /&gt;
* folder - The folder id&lt;br /&gt;
   &lt;br /&gt;
Response: An Object representing the loaded message.&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/message?action=send&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* recipients - (optional) If set the message is sent to the given list of recipients, otherwise this defaults to the &amp;quot;To&amp;quot; header of the message.&lt;br /&gt;
   &lt;br /&gt;
Request Body: The Request Body should contain the JSON Object representing the message to be sent.&lt;br /&gt;
Response: &amp;quot;1&amp;quot; as the data of a regular response on success.&lt;br /&gt;
&lt;br /&gt;
GET or PUT /ajax/messaging/message?action=perform&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* action - The messaging action to invoke&lt;br /&gt;
* id - The id of the message the action should be invoked on. Only used on actions of type &amp;quot;storage&amp;quot;.&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
   &lt;br /&gt;
Request Body: On actions of type &amp;quot;message&amp;quot; the body should contain the JSON representation of the message the action should be applied to.&lt;br /&gt;
Response: Either 1 if no further user interaction is needed or a messaging message that, after having the user modify it has to be supplied back to the follower action of this action.&lt;br /&gt;
&lt;br /&gt;
Thus, to invoke a messaging action of type &amp;quot;storage&amp;quot; the folder and id are needed. Messaging actions of type &amp;quot;message&amp;quot; need a folder and message in the body. &lt;br /&gt;
Messaging actions of type &amp;quot;none&amp;quot; need a messaging message and account. &lt;br /&gt;
&lt;br /&gt;
==== List style requests ====&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
* sort - (optional) A column to sort by.&lt;br /&gt;
* order - (optional) The order direction. &amp;quot;asc&amp;quot; for ascending or &amp;quot;desc&amp;quot; for descending. Defaults to &amp;quot;asc&amp;quot;&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the the columns parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/messages?action=list&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
&lt;br /&gt;
Request Body: An array of arrays with the folder and id as elements each identifying a message. &lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Snippet module (available with v7.0.0/v6.22.0) ==&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=get&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The snippet's JSON representation; e.g.&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;signature&amp;quot;,&lt;br /&gt;
    &amp;quot;props&amp;quot;: {&amp;quot;x-custom&amp;quot;: &amp;quot;any value&amp;quot;},&lt;br /&gt;
    &amp;quot;module&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;displayname&amp;quot;: &amp;quot;My signature&amp;quot;,&lt;br /&gt;
    &amp;quot;misc&amp;quot;: {&amp;quot;foo&amp;quot;: &amp;quot;bar&amp;quot;},&lt;br /&gt;
    &amp;quot;createdby&amp;quot;: 17,&lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;-- \\nMy name and position here&amp;quot;,&lt;br /&gt;
    &amp;quot;accountid&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;shared&amp;quot;: false,&lt;br /&gt;
    &amp;quot;files&amp;quot;:&lt;br /&gt;
    [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;mimetype&amp;quot;: &amp;quot;image/png; name=pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;filename&amp;quot;: &amp;quot;pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;46f49f8a-40d5-4f29-8bc9-728f3420864c&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 6074&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Gets all snippets associated with the current user and context ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=all&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* type		- Optional CSV of types to filter by; e.g. &amp;quot;signature&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets certain snippets by identifiers ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=list&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of snippet identifiers&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet's attachment by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=getattachment&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
* attachmentid	- The attachment identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The attachment's raw data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Creates a new snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=new&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The created snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Updates a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=update&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet providing the fields that should be changed.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's JSON representation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Deletes a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=delete&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier (otherwise provide one or more identifiers through request body's JSON array)&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of identifiers denoting the snippets to delete&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
An empty/dummy result (don't care)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Attaches one or more files to an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
POST /ajax/snippet?action=attach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
Multipart form data providing the upload files to attach to the snippet.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Detaches open or more files from an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=detach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array providing the identifiers of the attachments to remove from snippet&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
== Module Halo ==&lt;br /&gt;
&lt;br /&gt;
=== Investigate contact ===&lt;br /&gt;
&lt;br /&gt;
PUT /appsuite/api/halo/contact?action=investigate&lt;br /&gt;
&lt;br /&gt;
The investigate action provides access to different halo providers. &lt;br /&gt;
Each provider requires an own set of parameters and also provides different results. &lt;br /&gt;
The following section describes some but not necessarily all of this providers.&lt;br /&gt;
Each request contains the following common parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; - The provider to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; - (optional) The timezone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to this parameters a contact must be defined. This can be done either with at least one of the following parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or within the request body.&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
&lt;br /&gt;
Instead of the contact parameters one can send a JSON object within the body of the request. This body describes the contact.&lt;br /&gt;
If used, it must contain at least one of the fields shown below. If the requests contains a body, the contact specific parameters are ignored. &lt;br /&gt;
It is also possible to provide more contact information. Empty fields are filled up with this values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSON object:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
	&amp;quot;contact_id&amp;quot;:12345&lt;br /&gt;
	&amp;quot;internal_userid&amp;quot;:12345&lt;br /&gt;
	&amp;quot;email1&amp;quot;: mail1@domain.com&lt;br /&gt;
	&amp;quot;email2&amp;quot;: mail2@domain2.com&lt;br /&gt;
	&amp;quot;email3&amp;quot;: mail3@domain3.com&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
The request responds with a JSON object. The content and structure of this object depends on the chosen provider. &lt;br /&gt;
In each case the response contains only data known to the server. Therefore some or all fields may be null.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.contacts &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
&lt;br /&gt;
A JSON array with the contact informations specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.appointments &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Requests parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - The start point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; - The end point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
	&lt;br /&gt;
A JSON array of appointments. Each appointment contains the fields specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.mail &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - The maximum number of mails within the result.&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
	&lt;br /&gt;
A JSON array of mails. Each mail contains the fields specified by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get halo services ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact?action=services&lt;br /&gt;
&lt;br /&gt;
Request parameter: &lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
 &lt;br /&gt;
A JSON object with a &amp;quot;data&amp;quot; field which contains an array of all available halo providers.&lt;br /&gt;
&lt;br /&gt;
=== Get contact picture ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact/picture&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - (optional) falls back to the public session cookie&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt; - (optional)  The internal user id of a user whose picture you want to load&lt;br /&gt;
* &amp;lt;code&amp;gt;userid&amp;lt;/code&amp;gt; - (optional) an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;user_id&amp;lt;/code&amp;gt; - (optional)  an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - (optional) a contact id&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; - (optional) an email to search for. Will pick global address book matches before regular matches. After that picks the most recently changed contact&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt; - (optional)  an alias for email&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt; - (optional) another email address to use to find matches&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt; - (optional) and yet another email address to use to find matches&lt;br /&gt;
&lt;br /&gt;
''At least one of the optional search parameters should be set. All parameters are connected by OR during the search. More specific parameters like user_id or id are prioritized in case of multiple matches.''&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The picture with proper eTag and caching headers set, or an HTTP Status 404 response, if no picture could be found.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;capabilities&amp;quot; (available with v7.4.2) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to capabilities, i.e. modules or features that are available on the backend and the user has access to.&lt;br /&gt;
&lt;br /&gt;
=== Get a capability ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the capability&lt;br /&gt;
&lt;br /&gt;
Response: The requested capability as described in [[#Capability| Capability]], if available, otherwise an empty result&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capability&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capability&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id  || String       || The identifier of the capability&lt;br /&gt;
|-&lt;br /&gt;
| attributes    || Object       || A JSON object holding optional properties of the capability &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all capabilities ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of capability objects as described in [[#Capability| Capability]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;jump&amp;quot; (available with v7.6.0) ==&lt;br /&gt;
&lt;br /&gt;
The jump module is used to pass an acquired identity token for an authenticated user from one system to another for a single sign-on.&lt;br /&gt;
&lt;br /&gt;
=== Acquire an identity token ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jump?action=identityToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; – The identifier for the external service/system&lt;br /&gt;
&lt;br /&gt;
Response: The acquired identity token wrapped by a simple JSON object as described in [[#Jump| Jump]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Jump&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Jump&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| token  || String       || The identifier of the token&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;find&amp;quot; (preliminary, available with v7.6.1) ==&lt;br /&gt;
The Find API consists of calls for performing searches within the modules mail, contacts, calendar, tasks and drive. It was designed to provide an iterative approach where the search criteria can be refined step-wise until the desired items are found. The starting point is always an &amp;quot;autocomplete&amp;quot; request, that suggests possible search filters based on a users input. Those filters are grouped into categories, called &amp;quot;facets&amp;quot;. A facet may provide one or more &amp;quot;values&amp;quot; with every value being a possible filter. A client is meant to remember every value that was selected by a user and include it within the following &amp;quot;autocomplete&amp;quot; and &amp;quot;query&amp;quot; requests, while &amp;quot;query&amp;quot; performs the actual search and returns the found items.&lt;br /&gt;
&lt;br /&gt;
Every request is bound to a module that must be specified via the URL-Parameter &amp;quot;module&amp;quot;. Possible modules are&lt;br /&gt;
* mail&lt;br /&gt;
* contacts&lt;br /&gt;
* calendar&lt;br /&gt;
* tasks&lt;br /&gt;
* drive&lt;br /&gt;
&lt;br /&gt;
=== General assumptions ===&lt;br /&gt;
Some of the objects returned by the server contain former user input. A client must never interpret  strings as HTML but always as plain text to be not vulnerable for CSS attacks!&lt;br /&gt;
&lt;br /&gt;
=== Calls ===&lt;br /&gt;
The find API provides two dedicated calls under the servlet path &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* action=query&lt;br /&gt;
&lt;br /&gt;
=== Facets ===&lt;br /&gt;
The style of a facet is responsible for how the according object is structured, how it is handled on the server-side and how the client has to handle it.&lt;br /&gt;
We distinguish three styles of facets:&lt;br /&gt;
* simple&lt;br /&gt;
* default&lt;br /&gt;
* exclusive&lt;br /&gt;
&lt;br /&gt;
Every facet value contains an embedded &amp;quot;filter&amp;quot; object. The filter must not be changed by the client, it has to be seen as a black-box. Instead the filters&lt;br /&gt;
of selected facet values have to be copied and sent to the server with the subsequent requests.&lt;br /&gt;
&lt;br /&gt;
==== Simple Facets ====&lt;br /&gt;
A simple facet is a special facet that has exactly one value. The facets&lt;br /&gt;
type and its value are strictly coupled, in a way that a display name for both,&lt;br /&gt;
facet and value would be redundant. A simple facet generally denotes a logical field like&lt;br /&gt;
'phone number'. Internally this logical field can map to several internal fields&lt;br /&gt;
(e.g. 'phone_private', 'phone_mobile', 'phone_business'). In clients the facet as&lt;br /&gt;
a whole can be displayed as a single item. Example: &amp;quot;Search for 'term' in field 'phone&lt;br /&gt;
number'&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;simple&amp;quot; || Denotes that this is a facet of style simple&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
    &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Default Facets ====&lt;br /&gt;
A default facet contains multiple values and may be present&lt;br /&gt;
multiple times in search requests to filter results by a combination of different&lt;br /&gt;
values (e.g. &amp;quot;mails with 'foo' and 'bar' in subject&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;default&amp;quot; || Denotes that this is a facet of style default&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| values || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
    &amp;quot;values&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
        &amp;quot;item&amp;quot;:{&lt;br /&gt;
          &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
          &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exclusive Facets ====&lt;br /&gt;
An exclusive facet is a facet where the contained values are&lt;br /&gt;
mutually exclusive. That means that the facet must only be present once&lt;br /&gt;
in an autocomplete or query request.&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;exclusive&amp;quot; || Denotes that this is a facet of style exclusive&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| options || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
    &amp;quot;options&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Active Facets ====&lt;br /&gt;
Every value that has been selected by a user must be remembered and provided with every subsequent request. The representation of a facet within a request body differs from the one within an autocomplete response. We call those &amp;quot;active facets&amp;quot;. Their representation is independent from their style.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Active Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Active Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| facet || &amp;lt;string&amp;gt; || The id of the according facet.&lt;br /&gt;
|-&lt;br /&gt;
| value || &amp;lt;string&amp;gt; || The id of the according value. Must always be copied from the value object, not from a possibly according option (in the two-dimensional case).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter object, copied from the value or option.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
According to the users configuration, some restrictions may apply that have to be heeded by clients. Those restrictions can be retrieved via the &amp;quot;config&amp;quot; or the &amp;quot;jslob&amp;quot; modules. The following restrictions may apply:&lt;br /&gt;
&lt;br /&gt;
* A user might have limited access to modules and therefore the Find API may only serve requests for a subset of all possible modules. The configuration object may contain an object with key &amp;quot;modules&amp;quot;. Its value is an array containing all module identifiers that the user is allowed to use. If the user is not allowed to search in any module, the value will be null.&lt;br /&gt;
&lt;br /&gt;
* Some facets can be mandatory, i.e. they must be pre-defined by the client and provided with every request. Whether a facet is mandatory or not is decided on a per-module basis. The configuration object may contain an object with key &amp;quot;mandatory&amp;quot;. Every facet that may be mandatory is specified via its id in that object (e.g. mandatory.folder). The value of such a key is either an array containing all module identifiers, where the facet is mandatory or null, if it is not manadatory in any module.&lt;br /&gt;
  &lt;br /&gt;
* Due to performance reasons the service provider can enforce a minimium number of characters that have to be provided before an autocomplete request may be issued. That property is called &amp;quot;minimumQueryLength&amp;quot; and its value is an integer that specifies the minimum number of characters. If a client does not heed this property, the server will respond with an error if the provided user input is too short.&lt;br /&gt;
&lt;br /&gt;
==== Config Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/config/search?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
            &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                &amp;quot;mail&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;modules&amp;quot;: [&lt;br /&gt;
            &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;contacts&amp;quot;,&lt;br /&gt;
            &amp;quot;calendar&amp;quot;,&lt;br /&gt;
            &amp;quot;tasks&amp;quot;,&lt;br /&gt;
            &amp;quot;drive&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GET http://localhost/appsuite/api/config/minimumSearchCharacters?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSLob Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/jslob?action=get&amp;amp;id=io.ox/core&amp;amp;session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;io.ox/core&amp;quot;,&lt;br /&gt;
        &amp;quot;tree&amp;quot;: {&lt;br /&gt;
            &amp;quot;search&amp;quot;: {&lt;br /&gt;
                &amp;quot;modules&amp;quot;: [&lt;br /&gt;
                    &amp;quot;mail&amp;quot;,&lt;br /&gt;
                    &amp;quot;contacts&amp;quot;,&lt;br /&gt;
                    &amp;quot;calendar&amp;quot;,&lt;br /&gt;
                    &amp;quot;tasks&amp;quot;,&lt;br /&gt;
                    &amp;quot;drive&amp;quot;&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
                    &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                        &amp;quot;mail&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;minimumQueryLength&amp;quot;: 0&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocomplete ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* limit=&amp;lt;int&amp;gt; - The maximum number of values returned per facet&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the users input (specified as &amp;quot;prefix&amp;quot;), already selected facets and possible options.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=autocomplete&amp;amp;module=mail&amp;amp;limit=3&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;prefix&amp;quot;:&amp;quot;test&amp;quot;,  &lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;facets&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },      &lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
        &amp;quot;values&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
            &amp;quot;item&amp;quot;:{&lt;br /&gt;
              &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
              &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;options&amp;quot;:[&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== query ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=query&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* columns=&amp;lt;column-ids&amp;gt; - A comma-separated list of the module-specific columns that shall be contained in the response items.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the selected facets and possible options. For pagination the keys &amp;quot;start&amp;quot; and &amp;quot;size&amp;quot; can be set.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=query&amp;amp;module=mail&amp;amp;columns=102,600,601,602,603,604,605,607,608,610,611,614,652&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:null&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;subject&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:1409579708116,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:{&lt;br /&gt;
        &amp;quot;fields&amp;quot;:[&lt;br /&gt;
          &amp;quot;subject&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;queries&amp;quot;:[&lt;br /&gt;
          &amp;quot;lorem&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start&amp;quot;:0,&lt;br /&gt;
  &amp;quot;size&amp;quot;:101&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;num_found&amp;quot;:-1,&lt;br /&gt;
    &amp;quot;start&amp;quot;:0,&lt;br /&gt;
    &amp;quot;size&amp;quot;:1,&lt;br /&gt;
    &amp;quot;results&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;110458&amp;quot;,&lt;br /&gt;
        &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
        &amp;quot;attachment&amp;quot;:false,&lt;br /&gt;
        &amp;quot;from&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;John Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;john.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;to&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;jane.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cc&amp;quot;:[&lt;br /&gt;
&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;subject&amp;quot;:&amp;quot;Lorem Ipsum&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;:7501,&lt;br /&gt;
        &amp;quot;received_date&amp;quot;:1408531387000,&lt;br /&gt;
        &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
        &amp;quot;priority&amp;quot;:3,&lt;br /&gt;
        &amp;quot;account_name&amp;quot;:&amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
        &amp;quot;account_id&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Available Options ===&lt;br /&gt;
Every request body may contain an &amp;quot;options&amp;quot; object to finetune some specific behavior. Currently possible options are:&lt;br /&gt;
* timezone: &amp;lt;tz-name&amp;gt; - The timezone to use if any dates are returned.&lt;br /&gt;
* admin: &amp;lt;boolean&amp;gt; - true to include the context admin if it matches any search criteria. If the context admin shall always be ignored (i.e. not returned), false has to be set.&lt;br /&gt;
&lt;br /&gt;
=== Possible Flags ===&lt;br /&gt;
Every facet may carry one or more flags that describe further aspects of that facet. Currently possible flags are:&lt;br /&gt;
* conflicts - Specified in the form of &amp;quot;conflicts:&amp;lt;other-id&amp;gt;&amp;quot;. A facet carrying this flag must not be combined with a facet of type &amp;lt;other-id&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;share/management&amp;quot; (preliminary, available with v7.8.0) ==&lt;br /&gt;
&lt;br /&gt;
Share links and can be created and managed via different actions in the &amp;quot;share/management&amp;quot; module. Additionally, there are dedicated actions to list all shares of a user in the modules [[#Get_shared_folders_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;folders&amp;quot;]] and [[#Get_shared_infoitems_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;files&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== Get a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Basic information about an already existing or newly created share link as described in [[#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Target&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| module || String || The folder's module name, i.e. one of &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| folder || String || The folder identifier &lt;br /&gt;
|-&lt;br /&gt;
| item   || String || (Optional) The object identifier, in case the share targets a single item &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareLink&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Link&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| url   || String  || The link to the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| entity   || Number  || The identifier of the anonymous user entity for the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| is_new   || Boolean  || Whether the share link is new, i.e. it has been created by the &amp;lt;tt&amp;gt;getLink&amp;lt;/tt&amp;gt;-request, or if it already existed  (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Time   ||  (Optional) The end date / expiration time after which the share link is no longer accessible.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || (Optional) An additional secret / pin number an anonymous user needs to enter when accessing the share&lt;br /&gt;
|-&lt;br /&gt;
| meta || JSON || (Optional) Arbitrary JSON data saved along with the share as specified by client &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Update a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The last modified timestamp of the link to be updated. Used to detect concurrent modifications.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in [[#ShareLink|Share Link]] containing the properties of the link to update., as well as the share target itself as described in [[#ShareTarget|Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Delete a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be deleted for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Send a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional message can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;drive&amp;quot; ==&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side. &lt;br /&gt;
&lt;br /&gt;
A detailed description can be found in a sepearet article: [[OX_Drive_API|OX Drive API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;passwordchange&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Users can change their password via the &amp;quot;passwordchange&amp;quot; module. &lt;br /&gt;
&lt;br /&gt;
=== Update password ===&lt;br /&gt;
&lt;br /&gt;
Note: The new password will be set without any checks. The client must ensure that it is the password the user wants to set. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/passwordchange?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in PasswordChange.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PasswordChange&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Password change&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| old_password || String || The users' current password or 'null' if the password wasn't set before (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
| new_password || String || The new password the user wants to set or 'null' to remove the password (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File Storage Services ==&lt;br /&gt;
&lt;br /&gt;
File storage services represents a file storage backend; e.g. Drive, Dropbox, etc.&lt;br /&gt;
&lt;br /&gt;
A *File Storage Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a file storage service. Example: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Box File Storage Service&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| configuration || JSON object      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileservice?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of file storage service objects. &lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileservice?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the file storage service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a file storage service object.&lt;br /&gt;
&lt;br /&gt;
== File Storage Accounts ==&lt;br /&gt;
&lt;br /&gt;
A file storage account represents the concrete configuration of an account of a given file storage service.&lt;br /&gt;
A *file storage account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageAccount&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || String      || Identifies a given file storage account in the scope of its file storage service (Infostore, Dropbox.com, Google OneDrive etc.). This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| filestorageService || String  || The identifier of the file storage service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| qualifiedId || String || Identifies a given file storage account globally, i.e. accross all file storage services. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| rootFolder || String || ID of the accounts root folder within the folder tree. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| isDefaultAccount || Boolean || Whether this account is the users default account. Exactly one account will have this flag set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant file storage service &lt;br /&gt;
|-&lt;br /&gt;
| capabilities || List of Strings || A list of capability names. Possible values are: &amp;quot;FILE_VERSIONS&amp;quot;, &amp;quot;EXTENDED_METADATA&amp;quot;, &amp;quot;RANDOM_FILE_ACCESS&amp;quot;, &amp;quot;LOCKS&amp;quot; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are&lt;br /&gt;
&lt;br /&gt;
=== Create a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;filestorageService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delete a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileaccount?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* filestorageService - (optional) list only those accounts that belong to the given file storage service.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example for creating a new OAuth-based file storage account ===&lt;br /&gt;
&lt;br /&gt;
First, get the description of the file storage service for which a new account is supposed to be created:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/fileservice?action=get&amp;amp;id=boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   {&lt;br /&gt;
    id: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
    displayName: &amp;quot;Box File Storage Service&amp;quot;&lt;br /&gt;
    configuration: {&lt;br /&gt;
      widget: &amp;quot;oauthAccount&amp;quot;&lt;br /&gt;
      options: {&lt;br /&gt;
        type: &amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      name: &amp;quot;account&amp;quot;&lt;br /&gt;
      displayName: &amp;quot;Select an existing account&amp;quot;&lt;br /&gt;
      mandatory: true&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next get the associated OAuth account information:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/oauth/accounts?action=all&amp;amp;serviceId=com.openexchange.oauth.boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;data&amp;quot;:[{&amp;quot;id&amp;quot;:333,&amp;quot;displayName&amp;quot;:&amp;quot;My Box.com account&amp;quot;,&amp;quot;serviceId&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;}]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create the file storage account:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  PUT /ajax/fileaccount?action=new&amp;amp;session=...&lt;br /&gt;
  &lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;filestorageService&amp;quot;:&amp;quot;boxcom&amp;quot;,&lt;br /&gt;
    &amp;quot;displayName&amp;quot;:&amp;quot;My box.com account&amp;quot;,&lt;br /&gt;
    &amp;quot;configuration&amp;quot;:{&lt;br /&gt;
      &amp;quot;account&amp;quot;:&amp;quot;333&amp;quot;,&lt;br /&gt;
      &amp;quot;type&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response provides the relative (in context of the according file storage service) identifier of the newly created account:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;data&amp;quot;:19}&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21240</id>
		<title>HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=HTTP_API&amp;diff=21240"/>
		<updated>2016-01-12T13:18:33Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This document defines the Open-Xchange HTTP API which is used by the new AJAX GUI. The first chapter describes general definitions and conventions which apply to all server modules. All other chapters describe individual server modules.&lt;br /&gt;
&lt;br /&gt;
=== Low level protocol ===&lt;br /&gt;
&lt;br /&gt;
The client accesses the server through HTTP GET, POST and PUT requests. HTTP cookies are used for authentication and must therefore be processed and sent back by the client as specified by [http://tools.ietf.org/html/rfc6265 RFC 6265]. The HTTP API is accessible at URIs starting with &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;. Each server module has a unique name and its own sub-namespace with that name below &amp;lt;code&amp;gt;/ajax&amp;lt;/code&amp;gt;, e. g. all access to the module &amp;quot;tasks&amp;quot; is via URIs starting with &amp;lt;code&amp;gt;/ajax/tasks&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Text encoding is always UTF-8. Data is sent from the server to the client as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; and interpreted by the client to obtain an ECMAScript object. The HTTP API uses only a small subset of the ECMAScript syntax. This subset is roughly described by the following BNF:&lt;br /&gt;
&lt;br /&gt;
 Value   ::= &amp;quot;null&amp;quot; | Boolean | Number | String | Array | Object&lt;br /&gt;
 Boolean ::= &amp;quot;true&amp;quot; | &amp;quot;false&amp;quot;&lt;br /&gt;
 Number  ::= see NumericLiteral in ECMA 262 3rd edition&lt;br /&gt;
 String  ::= \&amp;quot;([^&amp;quot;\n\\]|\\[&amp;quot;\n\\])*\&amp;quot;&lt;br /&gt;
 Array   ::= &amp;quot;[]&amp;quot; | &amp;quot;[&amp;quot; Value (&amp;quot;,&amp;quot; Value)* &amp;quot;]&amp;quot;&lt;br /&gt;
 Object  ::= &amp;quot;{}&amp;quot; | &amp;quot;{&amp;quot; Name &amp;quot;:&amp;quot; Value (&amp;quot;,&amp;quot; Name &amp;quot;:&amp;quot; Value)* &amp;quot;}&amp;quot;&lt;br /&gt;
 Name    ::= [A-Fa-f][0-9A-Fa-f_]*&lt;br /&gt;
&lt;br /&gt;
Numbers are the standard signed integer and floating point numbers. Strings can contain any character, except double quotes, newlines and backslashes, which must be escaped by a backslash. Control characters in strings (other than newline) are not supported. Whitespace is allowed between any two tokens. See [http://json.org JSON] and [http://www.ecma-international.org/publications/standards/Ecma-262.htm ECMA 262, 3&amp;lt;sup&amp;gt;rd&amp;lt;/sup&amp;gt; edition] for the formal definition.&lt;br /&gt;
&lt;br /&gt;
The response body consists of an object, which contains up to four fields as described in [[#ResponseBody | Response body]]. The field &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; contains the actual payload which is described in following chapters. The fields &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;error_params&amp;lt;/code&amp;gt; are present when data objects are returned, if an error occurred and if the error message contains conversion specifiers, respectively. Following sections describe the contents of these fields in more detail.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResponseBody&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Response body&lt;br /&gt;
! Name         !! Type      !! Value&lt;br /&gt;
|-&lt;br /&gt;
| data         || Value     || Payload of the response.&lt;br /&gt;
|-&lt;br /&gt;
| timestamp    || Timestamp || The latest timestamp of the returned data (see [[HTTP_API#Updates|Updates]]).&lt;br /&gt;
|-&lt;br /&gt;
| error        || String    || The translated error message. Present in case of errors.&lt;br /&gt;
|-&lt;br /&gt;
| error_params || Array     || As o 7.4.2: Empty JSON array. Before that: Parameters for the error message that would need to be replaced in the error string (in a printf-format style).&lt;br /&gt;
|-&lt;br /&gt;
| error_id     || String    || Unique error identifier to help finding this error instance in the server logs.&lt;br /&gt;
|-&lt;br /&gt;
| error_desc     || String    || The technical error message (always English) useful for debugging the problem. Might be the same as error message if there is no more information available&lt;br /&gt;
|-&lt;br /&gt;
| code         || String    || Error code consisting of an upper-case module identifier and a four-digit message number, separated by a dash; e.g. &amp;quot;MSG-0012&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| error_stack     || Array    || If configured (see &amp;quot;com.openexchange.ajax.response.includeStackTraceOnError&amp;quot; in 'server.properties') this field provides the stack trace of associated Java exception represented as a JSON array&lt;br /&gt;
|-&lt;br /&gt;
| categories     || String OR Array    || Either a single (String) or list (Array) of upper-case category identifiers to which the error belongs. E.g.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| &amp;quot;USER_INPUT&amp;quot;  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFIGURATION&amp;quot;  || An error related to user/system configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;PERMISSION_DENIED&amp;quot;  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRY_AGAIN&amp;quot;  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;SERVICE_DOWN&amp;quot;  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONNECTIVITY&amp;quot;  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;ERROR&amp;quot;  || A programming error which was caused by incorrect program code.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CONFLICT&amp;quot;  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;CAPACITY&amp;quot; || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;TRUNCATED&amp;quot; || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;WARNING&amp;quot; || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| category     || Number    || Maintained for legacy reasons: The numeric representation of the first category:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || An error resulting from wrong or missing input from front-end (e.g. mandatory field missing).&lt;br /&gt;
|-&lt;br /&gt;
| 2  || An error strictly related to user configuration which denies requested operation.&lt;br /&gt;
|-&lt;br /&gt;
| 3  || An error related to insufficient permission settings.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || A requested operation could not be accomplished because a needed resource is temporary down or missing (e.g. imap server rejects connection because of too many established connections).&lt;br /&gt;
|-&lt;br /&gt;
| 5  || A subsystem or third party service is down and therefore does not respond (e.g. database is down).&lt;br /&gt;
|-&lt;br /&gt;
| 6  || The underlying socket connection is corrupt, empty or closed. Only a temporary error that does not affect the whole system.&lt;br /&gt;
|-&lt;br /&gt;
| 8  || A programming error which was caused by incorrect programm code.&lt;br /&gt;
|-&lt;br /&gt;
| 9  || A concurrent modification.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || The requested operation could not be performed cause an underlying resource is full or busy (e.g. IMAP folder exceeds quota).&lt;br /&gt;
|-&lt;br /&gt;
| 12 || The given data could not be stored into the database because an attribute contains a too long value.&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Action was at least partially successful, but a condition occurred that merited a warning&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Data from the client to the server can be sent in several formats. Small amounts of data are sent as &amp;lt;code&amp;gt;application/x-www-urlencoded&amp;lt;/code&amp;gt; in query parameters in the request URI. For POST requests, some or all parameters may be sent in the request body instead of in the URI using any valid encoding for POST requests. Alternatively, some requests specify that data is sent as &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; in the body of a PUT request. The format of the request body for PUT requests is the same as for sending data from the server to the client, except that the payload is sent directly, without being wrapped in another object.&lt;br /&gt;
&lt;br /&gt;
When updating existing data, the client sends only fields that were modified. To explicitly delete a field, the field is sent with the value &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. For fields of type &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, the empty string &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Error handling ===&lt;br /&gt;
&lt;br /&gt;
If the session of the user times out, if the client doesn't send a session ID or if the session for the specified session ID can not be found then the server returns the above described response object, that contains an error code and an error message. If the request URI or the request body is malformed or incomplete then the server returns the reponse object with an error message, too. In case of internal server errors, especially Java exceptions, or if the server is down, it returns the HTTP status code 503, Service Unavailable. Other severe errors may return other HTTP status values.&lt;br /&gt;
&lt;br /&gt;
Application errors, which can be caused by a user and are therefore expected during the operation of the groupware, are reported by setting the field error in the returned object, as described in [[#ResponseBody | Response body]]. Since the error messages are translated by the client, they can not be composed of multiple variable parts. Instead, the error message can contain simplified printf()-style conversion specifications, which are replaced by elements from the array in the field error_params. If error_params is not present, no replacement occurs, even if parts of the error message match the syntax of a conversion specification.&lt;br /&gt;
&lt;br /&gt;
A simplified conversion specification, as used for error messages, is either of the form %s or %''n''$s, where ''n'' is a 1-based decimal parameter index. The conversion specifications are replaced from left to right by elements from error_params, starting at the first element. %s is replaced by the current element and the current index is incremented. %''n''$s is replaced by the ''n''th element and the current index is set to the (''n'' + 1)th element.&lt;br /&gt;
&lt;br /&gt;
Some error message contain data sizes which must be expressed in Bytes or Kilobytes etc., depending on the actual value. Since the unit must be translated, this conversion is performed by the client. Unfortunately, standard printf()-style formatting does not have a specifier for this kind of translation. Therefore, the conversion specification for sizes is the same as for normal strings, and the client has to determine which parameters to translate based on the error code. The current error codes and the corresponding size parameters are listed in [[#DataSizeParameters | Data size parameters]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSizeParameters&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data size parameters&lt;br /&gt;
! Error code !! Parameter indices&lt;br /&gt;
|-&lt;br /&gt;
| CON-0101   || 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| FLS-0003   || 1, 2, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0065   || 1, 3&lt;br /&gt;
|-&lt;br /&gt;
| MSG-0066   || 1&lt;br /&gt;
|-&lt;br /&gt;
| NON-0005   || 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Date and time ===&lt;br /&gt;
&lt;br /&gt;
Dates without time are transmitted as the number of milliseconds between 00:00 UTC on that date and 1970-01-01 00:00 UTC. Leap seconds are ignored, therefore this number is always an integer multiple of 8.64e7.&lt;br /&gt;
&lt;br /&gt;
Because ECMAScript Date objects have no way to explicitly specify a timezone for calculations, timezone correction must be performed on the server. Dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''user's'' timezone and UTC at the time in question. (See the Java method java.util.TimeZone.getOffset(long)). Unless optional URL parameter &amp;lt;code&amp;gt;'''timezone'''&amp;lt;/code&amp;gt; is present. Then dates with time are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC (again, ignoring leap seconds) plus the offset between the ''specified'' timezone and UTC at the time in question.&lt;br /&gt;
&lt;br /&gt;
For some date and time values, especially timestamps, monotonicity is more important than the actual value. Such values are transmitted as the number of milliseconds since 1970-01-01 00:00 UTC, ignoring leap seconds and without timezone correction. If possible, a unique strictly monotonic increasing value should be used instead, as it avoids some race conditions described below.&lt;br /&gt;
&lt;br /&gt;
This specification refers to these three interpretations of the type Number as separate data types. The types are described in [[#DateAndTimeTypes | Date and time types]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DateAndTimeTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Date and time types&lt;br /&gt;
! Type      !! Time !! Timezone !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| Date      || No   || UTC      || Date without time.&lt;br /&gt;
|-&lt;br /&gt;
| Time      || Yes  || User     || Date and time.&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || Yes  || UTC      || Timestamp or unique sequence number.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
&lt;br /&gt;
To allow efficient synchronization of a client with changes made by other clients and to detect conflicts, the server stores a timestamp of the last modification for each object. Whenever the server transmits data objects to the client, the response object described in [[#ResponseBody | Response body]] includes the field timestamp. This field contains a timestamp value which is computed as the maximum of the timestamps of all transmitted objects.&lt;br /&gt;
&lt;br /&gt;
When requesting updates to a previously retrieved set of objects, the client sends the last timestamp which belongs to that set of objects. The response contains all updates with timestamps greater than the one specified by the client. The field timestamp of the response contains the new maximum timestamp value.&lt;br /&gt;
&lt;br /&gt;
If multiple different objects may have the same timestamp values, then a race condition exists when an update is processed between two such objects being modified. The first, already modified object will be included in the update response and its timestamp will be the maximum timestamp value sent in the timestamp field of the response. If the second object is modified later but gets the same timestamp, the client will never see the update to that object because the next update request from the client supplies the same timestamp value, but only modifications with greater timestamp values are returned.&lt;br /&gt;
&lt;br /&gt;
If unique sequence numbers can't be used as timestamps, then the risk of the race condition can be at least minimized by storing timestamps in the most precise format and/or limiting update results to changes with timestamp values which are measurably smaller than the current timestamp value.&lt;br /&gt;
&lt;br /&gt;
=== Editing ===&lt;br /&gt;
&lt;br /&gt;
Editing objects is performed one object at a time. There may be multiple objects being edited by the same client simulataneously, but this is achieved by repeating the steps required for editing a single object. There is no batch edit or upload command.&lt;br /&gt;
&lt;br /&gt;
To edit an object, a client first requests the entire object from the server. The server response contains the timestamp field described in the previous section. For in-place editing inside a view of multiple objects, where only already retrieved fields can be changed, retrieving the entire object is not necessary, and the last timestamp of the view is used as the timestamp of each object in it.&lt;br /&gt;
&lt;br /&gt;
When sending the modified object back to the server, only modified fields need to be included in the sent object. The request also includes the timestamp of the edited object. The timestamp is used by the server to ensure that the object was not edited by another client in the meantime. If the current timestamp of the object is greater than the timestamp supplied by the client, then a conflict is detected and the field error is set in the response. Otherwise, the object gets a new timestamp and the response to the client is empty.&lt;br /&gt;
&lt;br /&gt;
If the client displays the edited object in a view together with other objects, then the client will need to perform an update of that view immediately after successfully uploading an edited object.&lt;br /&gt;
&lt;br /&gt;
=== File uploads ===&lt;br /&gt;
&lt;br /&gt;
File uploads are made by sending a POST request that submits both the file and the needed fields as parts of a request of content-type “multipart/form-data” or “multipart/mixed”. The file metadata are stored in a form field “file” (much like an &amp;lt;input type=”file” name=”file” /&amp;gt; would do). In general a call that allows file uploads via POST will have a corresponding call using PUT to send object data. The JSON-encoded object-data that is send as the body of a corresponding PUT call is, when performed as a POST with file uploads, put into the request parameter “json”.&lt;br /&gt;
&lt;br /&gt;
Since the upload is performed directly by the browser and is not an Ajax call, the normal callback mechanism for asynchronous Javascript calls cannot be used to obtain the result. For this reason the server responds to these POST calls with a complete HTML page that performs the callback and should not be displayed to the user. The HTML response is functionally equivalent to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
     &amp;lt;head&amp;gt;&lt;br /&gt;
         &amp;lt;META http-equiv=&amp;quot;Content-Type&amp;quot; content=\&amp;quot;text/html; charset=UTF-8\&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
             (parent[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;] || window.opener &amp;amp;&amp;amp; window.opener[&amp;quot;callback_&amp;lt;b&amp;gt;action&amp;lt;/b&amp;gt;&amp;quot;])&lt;br /&gt;
             (&amp;lt;b&amp;gt;{json}&amp;lt;/b&amp;gt;)&lt;br /&gt;
         &amp;lt;/script&amp;gt;&lt;br /&gt;
     &amp;lt;/head&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The placeholders &amp;lt;code&amp;gt;{json}&amp;lt;/code&amp;gt; is replaced by the response with the timestamp that would be expected from the corresponding PUT method. The placeholder &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; is replaced by the value of the parameter &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; of the request (except for the import bundle, which is named &amp;quot;import&amp;quot; instead of the action name for legacy purposes). The content-type of the answer is &amp;lt;code&amp;gt;text/html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Non-browser clients don't need to interpret HTML or JavaScript. The JSON data can be recognized by the outermost &amp;lt;code&amp;gt;({&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;})&amp;lt;/code&amp;gt;, where the inner braces are part of the JSON value. For example, the regular expression &amp;lt;code&amp;gt;\((\{.*\})\)&amp;lt;/code&amp;gt; captures the entire JSON value in its first capturing group.&lt;br /&gt;
&lt;br /&gt;
=== Documentation conventions ===&lt;br /&gt;
&lt;br /&gt;
The rest of this document describes all available requests for each module. A module usually supports several different requests, which are differentiated by the used HTTP method, URI path and supplied URI parameters. The description of each method generally contains the following elements:&lt;br /&gt;
* the HTTP method followed by the request URI, inclusing the URI parameter action, which is used to differentiate methods,&lt;br /&gt;
* a list of URI parameters which can or must be supplied by the client,&lt;br /&gt;
* for PUT requests, content of the request body,&lt;br /&gt;
* for POST requests all described parameters are normally expected in the request body, exceptions are documented,&lt;br /&gt;
* &amp;quot;Response with timestamp:&amp;quot;if the timestamp field is required in the response body or simply &amp;quot;Response:&amp;quot; if not,&lt;br /&gt;
* content of the response payload, unless it is supposed to be empty.&lt;br /&gt;
&lt;br /&gt;
=== Common object data ===&lt;br /&gt;
&lt;br /&gt;
This table contains common fields which apply for any module's data type and is referenced throughout this document whenever a module's data type is described.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonObjectData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common object data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|-&lt;br /&gt;
| 100  || categories     || String  || String containing comma separated the categories. Order is preserved. Changing the order counts as modification of the object. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 101  || private_flag     || Boolean  || Overrides folder permissions in shared private folders: When true, this object is not visible to anyone except the owner. Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 102  || color_label  || Number  || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive). Not present in folder objects.&lt;br /&gt;
|-&lt;br /&gt;
| 104  || number_of_attachments     || Number  || Number of attachments &lt;br /&gt;
|-&lt;br /&gt;
| 105 || lastModifiedOfNewestAttachmentUTC || Time || Date and time of the newest attachment written with UTC time zone.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;login&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The login module is used to obtain a session from the user's login credentials. To understand the details of the different login methods, see the article titled &amp;quot;[[Login variations]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Because of security reasons each login variation will reject requests containing the parameter &amp;quot;password&amp;quot; within the URL query (starting with 7.8.0).&lt;br /&gt;
&lt;br /&gt;
=== Login ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters are normally expected in the POST request body:&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password MUST be placed in the request body, otherwise the login request will be denied.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; (optional) – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method.&lt;br /&gt;
&lt;br /&gt;
=== Form Login (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=formlogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request implements a possible login to the web frontend by only using a simple HTML form. An example for such a form can be found in the backend's documentation folder (&amp;lt;code&amp;gt;/usr/share/doc/open-xchange-core&amp;lt;/code&amp;gt;) under &amp;lt;code&amp;gt;examples/login.html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login name.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client must be the same as the client sent by the UI in the normal login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Used version of the HTTP/JSON interface client.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used.&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI. The URL of the web UI is either taken from the given parameter or from the configured default of the backend.&lt;br /&gt;
&lt;br /&gt;
For a complete description of the FormLogin-Process please see [[FormLogin|this documentation]]&lt;br /&gt;
&lt;br /&gt;
=== Token Login (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokenLogin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows every possible client to create a very short living session. This session can then be transferred to any other client preferably a browser entering then the normal web interface. Then the sessions life time will be extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Compared to the login mechanism using the random token, this request is more secure because two tokens are used. One of these tokens is only known to the client and one is generated by the server. Only the combination of both tokens allows to use the session. The combination of both tokens must be done by the client creating the session.&lt;br /&gt;
&lt;br /&gt;
DISCLAIMER: This request MUST NOT be used by some server side instance. If some server side instance uses this request to create a session for a browser on some client machine, then you have to transfer the full URL with server and client token over some connection to the client. This creates a VULNERABILITY if this is done. The token login method is only secure if this request is already sent from the same machine that later runs the browser using the created session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; – The login information.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – The password.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. This is for statistic evaluations what clients are used with Open-Xchange. If the autologin request should work the client should be the same as the client sent by the UI in the normal login request. For security considerations it can become necessary to define here the correct client that will use the session.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; – Version of the HTTP/JSON interface client. Only for statistic evaluations.&lt;br /&gt;
* &amp;lt;code&amp;gt;autologin&amp;lt;/code&amp;gt; – True or false. True tells the UI to issue a store request for the session cookie. This store request is necessary if you want the autologin request not to fail. This must be enabled on the server and a client can test with the autologin request if it is enabled or not.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – Defines another path on the web server where the UI is located. If this parameter is not defined the configured default of the backend is used.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; (optional) – IP address of the client host for that the session is created. If this parameter is not specified the IP address of the HTTP client doing this request is used. Currently the IP address may change when using the session with both tokens. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientUserAgent&amp;lt;/code&amp;gt; (optional) – Value of the User-Agent header of the client host for that the session is created. If this parameter is not specified the User-Agent of the current HTTP client doing this request is used. Currently the User-Agent may change when using the session. This can be disabled in future releases for security considerations.&lt;br /&gt;
* &amp;lt;code&amp;gt;jsonResponse&amp;lt;/code&amp;gt; (optional, since 7.8.0) – true or false (default). Defines the returned data type as JSON. Default 'false' will return a redirect. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A redirect to the web UI (or JSON including the redirect url in case jsonResponse=true is set). The URL of the web UI is either taken from the given parameter or from the configured default of the backend. This redirect will only contain the server side token. The client side token sent in the request must be appended by the client creating the session. The final URL must have the form &amp;lt;code style=&amp;quot;white-space: nowrap&amp;quot;&amp;gt;&amp;lt;var&amp;gt;redirect_URL&amp;lt;/var&amp;gt;&amp;amp;amp;clientToken=&amp;lt;var&amp;gt;token&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;. Both tokens are necessary to use the session and both tokens must match. Otherwise the session is terminated.&lt;br /&gt;
&lt;br /&gt;
=== Tokens (since 7.0.1) ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=tokens&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This request allows clients to access a session created with the [[#Token_Login_.28since_7.0.1.29 | tokenLogin]] request. When accessing the session its life time is extended equally to every other session.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;serverToken&amp;lt;/code&amp;gt; – Server side identifier for accessing the session. This identifier was created by the server and is contained in the tokenLogin response.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. This identifier was created by the client and passed within the POST data of the tokenLogin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. Currently this request allows to change the client identifier for the session. This eases creating the session because the identifier of the client using the session must not be known. For security considerations it can become necessary to drop this parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object conform to the normal [[#ResponseBody | response body]] contrary to the JSON object of the normal login request. This JSON object contains the session identifier, the login, the identifier and the locale of the user.&lt;br /&gt;
&lt;br /&gt;
=== Logout ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=logout&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh secret cookie (since 6.18.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=refreshSecret&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Refresh auto-login cookie ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login?action=store&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
=== Redirect ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/login;jsessionid=1157370816112.OX1?action=redirect&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURITY WARNING!''' Utilizing this request is '''INSECURE'''! This request allows to access a session with a single one time token. This one time token may be delivered to the wrong client if the protocol has an error or Apache or the load balancer make a mistake. This will cause a wrong user to be in a wrong session. '''IMMEDIATELY''' consider not to use this request anymore. You have been warned. Use instead the FormLogin that does not need to use the redirect request.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;random&amp;lt;/code&amp;gt; – A session random token to jump into the session. This random token is part of the login response. Only a very short configurable time after the login it is allowed to jump into the session with the random token.&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; (optional) – The client can be defined here newly if it is not correct on the login request itself.&lt;br /&gt;
* &amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt; (optional) – Tells the UI to do a store request after login to be able to use autologin request.&lt;br /&gt;
* &amp;lt;code&amp;gt;uiWebPath&amp;lt;/code&amp;gt; (optional) – The optional path on the webserver to the UI. If this parameter is not given the configured uiWebPath is used.&lt;br /&gt;
&lt;br /&gt;
=== Change IP ===&lt;br /&gt;
&lt;br /&gt;
The following request is especially for integration with systems located in the providers infrastructure. If those systems create a session with the following request the client host IP address in the session can be changed. The IP check for following requests will be done using this newly set client host IP address.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=changeip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientIP&amp;lt;/code&amp;gt; – New IP address of the client host for the current session.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the string &amp;quot;1&amp;quot; as data attribute.&lt;br /&gt;
&lt;br /&gt;
=== Redeem Token (since 7.4.0)===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/login?action=redeemToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; – The token created with [[#Get_a_login_token | acquireToken]].&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; – Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request. &lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; – Identifier of the client using the HTTP/JSON interface. The client must identifier must be the same for each request after creating the login session. &lt;br /&gt;
* &amp;lt;code&amp;gt;secret&amp;lt;/code&amp;gt; – The value of the secret string for token logins. This is configured through the tokenlogin-secrets configuration file.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the session ID used for all subsequent requests. Additionally a random token is contained to be used for the Easy Login method. If configured within tokenlogin-secrets configuration file even the user password will be returned.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;config&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The config module is used to retrieve and set user-specific configuration. The configuration is stored in a tree. Each node of the tree has a name and a value. The values of leaf nodes are strings which store the actual configuration data. The values of inner nodes are defined recursively as objects with one field for each child node. The name and the value of each field is the name and the value of the corresponding child node, respectively.&lt;br /&gt;
&lt;br /&gt;
The namespace looks like the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/ajax/config/&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; – A string containing GUI-specific settings (currently, it is a huge [[#Low_level_protocol | JSON]] object).&lt;br /&gt;
** &amp;lt;code&amp;gt;fastgui&amp;lt;/code&amp;gt; - A string containing GUI-specific settings. This is a JSON object that must be kept small for performance.&lt;br /&gt;
** &amp;lt;code&amp;gt;context_id&amp;lt;/code&amp;gt; - the unique identifier of the context (read-only, added 2008-01-28).&lt;br /&gt;
** &amp;lt;code&amp;gt;cookielifetime&amp;lt;/code&amp;gt; - the cookie life time in seconds or &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; for session cookie (read-only, added 2010-11-16).&lt;br /&gt;
** &amp;lt;code&amp;gt;identifier&amp;lt;/code&amp;gt; – the unique identifier of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;contact_id&amp;lt;/code&amp;gt; – the unique identifier of the contact data of the user (read-only).&lt;br /&gt;
** &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; – the configured language of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; – the configured timezone of the user.&lt;br /&gt;
** &amp;lt;code&amp;gt;availableTimeZones&amp;lt;/code&amp;gt; – a JSON object containing all available time zones. The key is the time zone identifier and the value contains its name in users language. (read-only, added 2010-07-08/v6.18).&lt;br /&gt;
** &amp;lt;code&amp;gt;calendarnotification&amp;lt;/code&amp;gt; - send a mail notification for appointments (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;tasknotification&amp;lt;/code&amp;gt; - send a mail notification for tasks (deprecated since 2008-12-11)&lt;br /&gt;
** &amp;lt;code&amp;gt;reloadTimes&amp;lt;/code&amp;gt; - Selectable times for GUI reload&lt;br /&gt;
** &amp;lt;code&amp;gt;serverVersion&amp;lt;/code&amp;gt; - Version string of the server.&lt;br /&gt;
** &amp;lt;code&amp;gt;currentTime&amp;lt;/code&amp;gt; - User timezone specific long of the current server time.&lt;br /&gt;
** &amp;lt;code&amp;gt;maxUploadIdleTimeout&amp;lt;/code&amp;gt; - Timeout after that idle uploads are deleted.&lt;br /&gt;
** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard folder of the user&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt; – the standard task folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt; – the standard calendar folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt; – the standard contacts folder (read-only)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt; – the private infostore folder (read-only, since v6.20.1)&lt;br /&gt;
*** &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt; – whether EAS folder selection is enabled (read-only)&lt;br /&gt;
** &amp;lt;code&amp;gt;mail/&amp;lt;/code&amp;gt; – settings for the email module (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with.  (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder/&amp;lt;/code&amp;gt; – the standard email folders (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;htmlinline&amp;lt;/code&amp;gt; – activate inlining of HTML attachments. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;colorquote&amp;lt;/code&amp;gt; – color quoted lines. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;harddelete&amp;lt;/code&amp;gt; – delete emails at once. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;inlineforward&amp;lt;/code&amp;gt; – forward messages as inline or attachment. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;notifyonreadack&amp;lt;/code&amp;gt; – notify on read acknowledgement. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;msgpreview&amp;lt;/code&amp;gt; – show a message preview. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;ignorereplytext&amp;lt;/code&amp;gt; (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;nocopytosent&amp;lt;/code&amp;gt; – don't put a copy to the sent folder when sending mails. (deprecated 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; - Spam Button should be displayed in GUI or not. (deprecated 2008-04-29)&lt;br /&gt;
** &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;autoSearch&amp;lt;/code&amp;gt; - If a search for all users, groups and resources when participant selection dialog is opened. (read-only, added 2008-10-09/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;maximumNumberParticipants&amp;lt;/code&amp;gt; – Defines the maximum number of participants for appointments and tasks. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;showWithoutEmail&amp;lt;/code&amp;gt; - If external participants without email should be shown.&lt;br /&gt;
*** &amp;lt;code&amp;gt;showDialog&amp;lt;/code&amp;gt; – Enables participant selection dialog for appointments and tasks. (read-only, added 2008-04-30/SP4)&lt;br /&gt;
** &amp;lt;code&amp;gt;availableModules&amp;lt;/code&amp;gt; – Contains a JSON array listing all enabled modules for a user. GUI loads Plugins through this list. To get your plugin listed here, create a subtree below &amp;lt;code&amp;gt;modules/&amp;lt;/code&amp;gt; without a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; subelement or with a subelement containing &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; (read-only, added 2008-02-25)&lt;br /&gt;
** &amp;lt;code&amp;gt;minimumSearchCharacters&amp;lt;/code&amp;gt; – Minimum number of characters a search pattern must have to prevent large responses and slow queries. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
** &amp;lt;code&amp;gt;modules&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;portal&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for portal module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt; – all email addresses of the user including the primary address (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;appendmailtext&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allowhtmlimages&amp;lt;/code&amp;gt; – Alters default setting whether external images contained in HTML content are allowed or not (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;colorquoted&amp;lt;/code&amp;gt; – color quoted lines (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectFolder&amp;lt;/code&amp;gt; – contact folder id to save mail addresses from sent mails (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectEnabled&amp;lt;/code&amp;gt; – switch contact collection on/off (added 2008-10-16)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailAccess&amp;lt;/code&amp;gt; – enables/disables contact collection for incoming mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;contactCollectOnMailTransport&amp;lt;/code&amp;gt; – enables/disables contact collection for outgoing mails. Default is true. (added 2009-09-24)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultaddress&amp;lt;/code&amp;gt; – primary email address of the user (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;deletemail&amp;lt;/code&amp;gt; – delete emails or move to trash (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;emoticons&amp;lt;/code&amp;gt; – display emoticons as graphics (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
***** &amp;lt;code&amp;gt;drafts&amp;lt;/code&amp;gt; – identifier of the folder with the mail drafts (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;inbox&amp;lt;/code&amp;gt; – identifier of the folder that gets all incoming mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;sent&amp;lt;/code&amp;gt; – identifier of the folder with the sent mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;spam&amp;lt;/code&amp;gt; – identifier of the folder with the spam mails (read-only, added 2008-02-25)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the folder with the deleted mails (read-only, added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;forwardmessage&amp;lt;/code&amp;gt; – forward messages as inline or attachment (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for mail module&lt;br /&gt;
**** &amp;lt;code&amp;gt;inlineattachments&amp;lt;/code&amp;gt; – activate inlining of HTML attachments (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;linewrap&amp;lt;/code&amp;gt; – (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – if mail module is enabled or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;phishingheaders&amp;lt;/code&amp;gt; – header(s) identifying phishing headers (added 2008-05-27)&lt;br /&gt;
**** &amp;lt;code&amp;gt;replyallcc&amp;lt;/code&amp;gt; – put all recipients on reply all into CC (added 2008-12-16/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;sendaddress&amp;lt;/code&amp;gt; – one email address out of the addresses list that are email sent with (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;spambutton&amp;lt;/code&amp;gt; – Spam Button should be displayed in GUI or not (added 2008-02-25)&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt; – attach vcard when sending mails (added 2008-02-25)&lt;br /&gt;
*** &amp;lt;code&amp;gt;calendar&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_conflict&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;calendar_teamview&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the calendar module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted appointments (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined appointments that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPrivate&amp;lt;/code&amp;gt; Default status for new appointments in private folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
**** &amp;lt;code&amp;gt;defaultStatusPublic&amp;lt;/code&amp;gt; Default status for new appointments in public folders, where the user is participant. This does not affect appointments created by this user, which always have the status &amp;quot;accepted&amp;quot;. The status are described in [[#UserParticipantObject | User participant object]]. Default is 0:none (added 2009-07-20/6.12)&lt;br /&gt;
*** &amp;lt;code&amp;gt;contacts&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the contacts module&lt;br /&gt;
**** &amp;lt;code&amp;gt;mailAddressAutoSearch&amp;lt;/code&amp;gt; – Define if a search is triggered when the recipient selection dialog is opened or the folder is changed. (read-only, added 2008-10-20/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; True if the contact module is enabled for the current user, false otherwise.&lt;br /&gt;
**** &amp;lt;code&amp;gt;singleFolderSearch&amp;lt;/code&amp;gt; – True if the current user is allowed to search for contacts only in a single folder. False if contact searches across all folders are allowed. (read-only, added 2009-02-04/SP5 U1)&lt;br /&gt;
**** &amp;lt;code&amp;gt;characterSearch&amp;lt;/code&amp;gt; – True if the side bar for searching for contacts by a start letter should be displayed. False if the side bar should be hidden. (read-only, added 2009-05-29/6.10)&lt;br /&gt;
**** &amp;lt;code&amp;gt;allFoldersForAutoComplete&amp;lt;/code&amp;gt; – true if an auto complete search may omit the folder identifier array and search for contacts in all readable folders. This is configured through the contact.properties configuration file. (read-only, added 2010-07-22/v6.18.0)&lt;br /&gt;
*** &amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the tasks module&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;delegate_tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyNewModifiedDeleted&amp;lt;/code&amp;gt; receive mail notification for new, modified or deleted tasks (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsCreator&amp;lt;/code&amp;gt; receive mail notification for accepted or declined tasks created by the user (added 2008-12-11/SP5)&lt;br /&gt;
**** &amp;lt;code&amp;gt;notifyAcceptedDeclinedAsParticipant&amp;lt;/code&amp;gt; receive mail notification for accepted or declined taks that the user participates (added 2008-12-11/SP5)&lt;br /&gt;
*** &amp;lt;code&amp;gt;infostore&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; GUI settings for the infostore module&lt;br /&gt;
**** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – the standard infostore folders (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;trash&amp;lt;/code&amp;gt; – identifier of the default infostore trash folder (read-only, since 7.6.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;pictures&amp;lt;/code&amp;gt; – identifier of the default infostore pictures folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;documents&amp;lt;/code&amp;gt; – identifier of the default infostore documents folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;music&amp;lt;/code&amp;gt; – identifier of the default infostore music folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;videos&amp;lt;/code&amp;gt; – identifier of the default infostore videos folder (read-only, since 7.8.0)&lt;br /&gt;
***** &amp;lt;code&amp;gt;templates&amp;lt;/code&amp;gt; – identifier of the default infostore templates folder (read-only, since 7.8.0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;interfaces&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;ical&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;vcard&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;syncml&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt; UI settings for the folder tree&lt;br /&gt;
**** &amp;lt;code&amp;gt;public_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;read_create_shared_folders&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – Selected folder tree, the user wants to use. Currents trees are 0 for the known OX folder tree and 1 for the new virtual folder tree. (added 2010-04-09/6.18)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.extras&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Extras link in the configuration (read only, added 2008-04-29)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to change the Password within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.user.personaldata&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Will load Plug-In which allows to edit personal contact information within the users configuration (read only, added 2008-07-09)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.group&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit groups and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.resource&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to edit resources and loads the corresponding Plug-In. (read only, added 2008-08-08)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.publish&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to publish items. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;com.openexchange.subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; – Specifies whether the user is allowed to subscribe sources. (read only, added 2009-05-27)&lt;br /&gt;
*** &amp;lt;code&amp;gt;olox20&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Tells the UI if the user is allowed to use the OXtender for Microsoft Outlook 2. (read only, added 2011-03-15/6.20)&lt;br /&gt;
**** &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is set to false to prevent the UI from trying to load a plugin. (read only, added 2011-03-15/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
****&amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Is true if the OXUpdater package is installed and started. (read only, added 2011-06-01/6.20)&lt;br /&gt;
****&amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; – Is true if the user is allowed to download the OXUpdater. Otherwise it's false. (read only, added 2011-06-01/6.20)&lt;br /&gt;
***&amp;lt;code&amp;gt;com.openexchange.passwordchange&amp;lt;/code&amp;gt;&lt;br /&gt;
**** &amp;lt;code&amp;gt;showStrength&amp;lt;/code&amp;gt; – Show a widget, which displays the current passwort Strength while entering. (default: false)&lt;br /&gt;
**** &amp;lt;code&amp;gt;minLength&amp;lt;/code&amp;gt; – The minimum length of an entered password. (default: 4)&lt;br /&gt;
**** &amp;lt;code&amp;gt;maxLength&amp;lt;/code&amp;gt; – The maximum length of an entered password. 0 for unlimited. (default: 0)&lt;br /&gt;
**** &amp;lt;code&amp;gt;regexp&amp;lt;/code&amp;gt; – Defines the class of allowed special characters as Regular Expression. (default: [^a-z0-9])&lt;br /&gt;
**** &amp;lt;code&amp;gt;special&amp;lt;/code&amp;gt; – Shows an example of allowed special characters to the user. Should be a subset of &amp;quot;regexp&amp;quot; in a human readable format. (default: $, _, or %) &lt;br /&gt;
&lt;br /&gt;
=== Get configuration data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
=== Set configuration data ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config/path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The new value of the node specified by path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/config?action=get_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1234&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set a property (since 7.6.2) ===&lt;br /&gt;
&lt;br /&gt;
Note: Only allowed for context administrator!&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/config?action=set_property&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The name of the property to set.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the value to set; e.g&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;value&amp;quot;:&amp;quot;test1237&amp;quot;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON response providing the property's name and its new value; e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;com.openexchange.dummy.prop001&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;test1237&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;folders&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The folders module is used to access the OX folder structure.&lt;br /&gt;
&lt;br /&gt;
=== Special System Folders ===&lt;br /&gt;
&lt;br /&gt;
Folders with some kind of special.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! ID !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 6 || contacts || System Users&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get root folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=root&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response: An array with data for all folders at the root level of the folder structure. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;CommonFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Common folder data&lt;br /&gt;
! ID  !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 1   || id            || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 2   || created_by    || String  || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| 3   || modified_by   || String  || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| 4   || creation_date || Time    || Date and time of creation.&lt;br /&gt;
|-&lt;br /&gt;
| 5   || last_modified || Time    || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| 6 || last_modified_utc || Timestamp || Timestamp of the last modification. Note that the type is Timestamp, not Time. See [[#Date and time]] for details. (added 2008-10-17, with SP5, temporary workaround)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || folder_id     || String  || Object ID of the parent folder.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedFolderData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed folder data&lt;br /&gt;
! ID  !! Name            !! Type             !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || title           || String           || Name of this folder.&lt;br /&gt;
|-&lt;br /&gt;
| 301 || module          || String           || Name of the module which implements this folder; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot;, or &amp;quot;mail&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 302 || type            || Number           || Type of folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || private&lt;br /&gt;
|-&lt;br /&gt;
| 2 || public&lt;br /&gt;
|-&lt;br /&gt;
| 3 || shared&lt;br /&gt;
|-&lt;br /&gt;
| 5 || system folder&lt;br /&gt;
|-&lt;br /&gt;
| 7 || This type is no more in use (legacy type). Will be removed with a future update!&lt;br /&gt;
|-&lt;br /&gt;
| 16 || trash&lt;br /&gt;
|-&lt;br /&gt;
| 20 || pictures&lt;br /&gt;
|-&lt;br /&gt;
| 21 || documents&lt;br /&gt;
|-&lt;br /&gt;
| 22 || music&lt;br /&gt;
|-&lt;br /&gt;
| 23 || videos&lt;br /&gt;
|-&lt;br /&gt;
| 24 || templates&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 304 || subfolders      || Boolean          || true if this folder has subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || own_rights      || Number or String || Permissions which apply to the current user, as described either in [[#PermissionFlags | Permission flags]] or in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| 306 || permissions     || Array            || Each element is an object described in [[#PermissionObject | Permission object]].&lt;br /&gt;
|-&lt;br /&gt;
| 307 || summary         || String           || Information about contained objects.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || standard_folder || Boolean          || Indicates whether or not folder is marked as a default folder (only OX folder)&lt;br /&gt;
|-&lt;br /&gt;
| 309 || total           || Number           || The number of objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 310 || new             || Number           || The number of new objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 311 || unread          || Number           || The number of unread objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 312 || deleted         || Number           || The number of deleted objects in this Folder.&lt;br /&gt;
|-&lt;br /&gt;
| 313 || capabilities || Number || Bit mask containing information about mailing system capabilites, as described in [[#Capabilities | capabilities]].&lt;br /&gt;
|-&lt;br /&gt;
| 314 || subscribed || Boolean || Indicates whether this folder should appear in folder tree or not. '''Note:''' Standard folders cannot be unsubscribed.&lt;br /&gt;
|-&lt;br /&gt;
| 315 || subscr_subflds || Boolean || Indicates whether subfolders should appear in folder tree or not.&lt;br /&gt;
|-&lt;br /&gt;
| 316 || standard_folder_type || Number || Indicates the default folder type. Zero for non-default folder. See [[#DefaultTypes | Standard folder types]]&lt;br /&gt;
|-&lt;br /&gt;
| 317 || supported_capabilities || Array || Each element is a String identifying a supported folder capability as described in [[#SupportedCapabilities | supported capabilities]]. Only applicable for non-mail folders. Read Only, Since 7.4.0.&lt;br /&gt;
|-&lt;br /&gt;
| 318 || account_id || String || Will be &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; if the folder does not belong to any account&lt;br /&gt;
(i.e. if its module doesn't support multiple accounts), is a virtual folder or an account-agnostic system folder. Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 3010 || com.openexchange.publish.publicationFlag || Boolean || Indicates whether this folder is published. Read Only, provided by the com.openexchange.publish plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3020 || com.openexchange.subscribe.subscriptionFlag || Boolean || Indicates whether this folder has subscriptions storing their content in this folder. Read Only, provided by the com.openexchange.subscribe plugin, since 6.14.&lt;br /&gt;
|-&lt;br /&gt;
| 3030 || com.openexchange.folderstorage.displayName || String || Provides the display of the folder's owner. Read Only, Since 6.20.&lt;br /&gt;
|-&lt;br /&gt;
| 3060 || com.openexchange.share.extendedPermissions || Array || Each element is an object described in [[#ExtendedPermissionObject | Extended permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  0-6 || Folder permissions:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || See the folder.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Create objects in the folder. '''Note''': '''Does not apply to folders of module ''system'''''.&lt;br /&gt;
|-&lt;br /&gt;
| 4  || Create subfolders.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Create subfolders&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&amp;lt;br&amp;gt;'''NOTE''': ''Create objects in the folder'' is not covered by ''Create subfolders'' if folder's module is ''system''.&lt;br /&gt;
|-&lt;br /&gt;
|  7-13 || Read permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Read only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Read all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Read all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 14-20 || Write permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Modify only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Modify all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Modify all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 21-27 || Delete permissions for objects in the folder:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0  || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1  || Delete only own objects.&lt;br /&gt;
|-&lt;br /&gt;
| 2  || Delete all objects.&lt;br /&gt;
|-&lt;br /&gt;
| 64 || All permissions. This is currently the same as &amp;quot;Delete all objects&amp;quot; but in the future additional permissions may be added that will be given to the user when using this value.&lt;br /&gt;
|}&lt;br /&gt;
The values are scalars and not bit sets. Any other than the described values should not be used. If they are used expect an exception from the backend. Every value automatically contains the access rights covered by lower values.&lt;br /&gt;
|-&lt;br /&gt;
| 28    || Admin flag:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || No permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Every operation modifying the folder in some way requires this permission. This are e.g. changing the folder name, modifying the permissions, deleting or moving the folder.&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || For non-mail folders, a number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| rights || String  || For mail folders, the rights string as defined in RFC 2086.&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user (ignored for type &amp;quot;anonymous&amp;quot; or &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capabilities&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Mailing system supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Mailing system supports ordering mails by their thread reference.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Mailing system supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Mailing system supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Mailing system supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note''': Capabilities describe the entire mailing system (mail account), not the specific folder in which they are transmitted. E.g. bit 4 of the capabilities on the user's inbox describes whether subscriptions are supported by the default account, even though the inbox itself cannot be unsubscribed because it's a standard folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DefaultTypes&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Standard Folder Types&lt;br /&gt;
! Bit  !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || No default folder.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Task.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Calendar.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Contact.&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Inbox.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Infostore.&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Drafts.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Sent.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Spam.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Trash.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SupportedCapabilities&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Supported Capabilities&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| permissions || Folder storage supports permissions.&lt;br /&gt;
|-&lt;br /&gt;
| publication || Folder storage supports folder publication.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Folder storage supports quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| sort || Folder storage supports sorting.&lt;br /&gt;
|-&lt;br /&gt;
| subscription || Folder storage supports folder subscription.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get subfolders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;errorOnDuplicateName&amp;lt;/code&amp;gt; – An optional flag to enable or disable (default) check for duplicate folder names within returned folder response (since v6.20.1). If a duplicate folder name is detected, an appropriate error is returned as [[#ResponseBody | response]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders, which have the folder with the requested object ID as parent. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get path ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of a folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all parent nodes until root folder. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated folders ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; – Object ID of a folder, which is the parent folder of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for new, modified and deleted folders. New and modified folders are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted folders (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a folder ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested folder. The fields of the object are listed in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id is not present. Since OX access controls are folder-based, the folder object also defines the permissions for the objects it contains. The permissions for a given user or group are defined by the object described in [[#PermissionObject | Permission object]]. The format of the actual permissions depends on the type of the folder. The permissions of mail folders are transmitted as a rights string as defined in section 3 of RFC 2086. Permissions of all other folders are transmitted as a single nonnegative integer number. The permissions for any given action on the folder or on contained objects is defined by a group of bits in the binary representation of this number. Each group of bits is interpreted as a separate number. Zero always means &amp;quot;no permissions&amp;quot;. Any other values add new permissions and always include the permissions of all lower values. The individual values are described in [[#PermissionFlags | Permission flags]].&lt;br /&gt;
&lt;br /&gt;
=== Update a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated folder. If the folder was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
* &amp;lt;code&amp;gt;cascadePermissions&amp;lt;/code&amp;gt; – (Optional. Defaults to false) Flag to cascade permissions to all sub-folders. The user must have administrative permissions to all sub-folders subject to change. If one permission change fails, the entire operation fails. (Since 7.8.0)&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. Only modified fields are present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create a folder ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder_id&amp;lt;/code&amp;gt; – The parent folder of the newly created folder&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: Folder object as described in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]]. The field id should not be present. It is possible to let added permission entities be notified about newly shared folders for all modules except mail. In that case you need to provide the folder data as an object &amp;quot;folder&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;folder&amp;quot;:{&lt;br /&gt;
    &amp;quot;permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:257&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provided that permission is granted to create a folder, its module is bound to the limitation, that the new folder's module must be equal to parent folder's module except that:&lt;br /&gt;
* Parent folder is one of the system folders &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt;. Below these folders task, calendar, and contact modules are permitted.&lt;br /&gt;
* Parent folder's module is one of task, calendar, or contact. Below this kind of folders task, calendar, and contact modules are permitted.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created folder.&lt;br /&gt;
&lt;br /&gt;
=== Delete folders ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The optional timestamp of the last update of the deleted folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered. &lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the folders are deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the folders are not yet located below the trash folder, they are moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of the folders that shall be deleted.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of folders that were '''NOT''' deleted. There may be a lot of different causes for a not deleted folder: A folder has been modified in the mean  time, the user does not have the permission to delete it or those permissions have just been removed, the folder does not exist, etc.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content  ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=clear&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – (Preliminary) The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed_modules&amp;lt;/code&amp;gt; – (Preliminary) An array of modules (either numbers or strings; e.g. &amp;quot;tasks,calendar,contacts,mail&amp;quot;) supported by requesting client. If missing, all available modules are considered.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
=== Get all visible folder of a certain module  (since v6.18.2)  ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=allVisible&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;)&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; –  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object containing three fields: &amp;quot;private&amp;quot;, &amp;quot;public, and &amp;quot;shared&amp;quot;. Each field is a JSON array with data for all folders. Each folder is itself described by an array.&lt;br /&gt;
&lt;br /&gt;
=== Get shared folders (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/folders?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for folders are defined in [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – Set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to list even not subscribed folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; – The desired content type (either numbers or strings; e.g. \&amp;quot;tasks\&amp;quot;, \&amp;quot;calendar\&amp;quot;, \&amp;quot;contacts\&amp;quot;, \&amp;quot;infostore\&amp;quot;). Note: this action is not implemented for module &amp;quot;mail&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with data for all folders that are considered as shared by the user. Each array element describes one folder and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared folder (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/folders?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; – The identifier of the folder tree. If missing '0' (primary folder tree) is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared folder to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;tasks&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The tasks module is used to access task information.&lt;br /&gt;
&lt;br /&gt;
=== Get all tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskAndAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task and appointment data&lt;br /&gt;
! ID  !! Name                     !! Type         !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 200 || title                    || String       || Short description.&lt;br /&gt;
|-&lt;br /&gt;
| 201 || start_date               || Date or Time || Inclusive start of the event as Date for tasks and whole day appointments and Time for normal appointments. For sequencies, this date must be part of the sequence, i. e. sequencies always start at this date. (deprecated for tasks since v7.6.1, replaced by start_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 202 || end_date                 || Date or Time || Exclusive end of the event as Date for tasks and whole day appointments and as Time for normal appointments.  (deprecated for tasks since v7.6.1, replaced by end_time and full_time)&lt;br /&gt;
|-&lt;br /&gt;
| 203 || note                     || String       || Long description.&lt;br /&gt;
|-&lt;br /&gt;
| 204 || alarm                    || Number or Time || Specifies when to notify the participants as the number of minutes before the start of the appointment (-1 for &amp;quot;no alarm&amp;quot;). For tasks, the Time value specifies the absolute time when the user should be notified.&lt;br /&gt;
|-&lt;br /&gt;
| 209 || recurrence_type          || Number       || Specifies the type of the recurrence for a task sequence:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none (single event)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || daily&lt;br /&gt;
|-&lt;br /&gt;
| 2 || weekly&lt;br /&gt;
|-&lt;br /&gt;
| 3 || monthly&lt;br /&gt;
|-&lt;br /&gt;
| 4 || yearly&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 212 || days                     || Number       || Specifies which days of the week are part of a sequence. The value is a bitfield with bit 0 indicating sunday, bit 1 indicating monday and so on. May be present if recurrence_type &amp;gt; 1. If allowed but not present, the value defaults to 127 (all 7 days).&lt;br /&gt;
|-&lt;br /&gt;
| 213 || day_in_month             || Number       || Specifies which day of a month is part of the sequence. Counting starts with 1. If the field &amp;quot;days&amp;quot; is also present, only days selected by that field are counted. If the number is bigger than the number of available days, the last available day is selected. Present if and only if recurrence_type &amp;gt; 2.&lt;br /&gt;
|-&lt;br /&gt;
| 214 || month                    || Number       || Month of the year in yearly sequencies. 0 represents January, 1 represents February and so on. Present if and only if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 215 || interval                 || Number       || Specifies an integer multiplier to the interval specified by recurrence_type. Present if and only if recurrence_type &amp;gt; 0. Must be 1 if recurrence_type = 4.&lt;br /&gt;
|-&lt;br /&gt;
| 216 || until                    || Date         || Inclusive end date of a sequence. May be present only if recurrence_type &amp;gt; 0. The sequence has no end date if recurrence_type &amp;gt; 0 and this field is not present. Note: since this is a Date, the entire day after the midnight specified by the value is included.&lt;br /&gt;
|-&lt;br /&gt;
| 217 || notification             || Boolean      || If true, all participants are notified of any changes to this object. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client.&lt;br /&gt;
|-&lt;br /&gt;
| 220 || participants             || Array        || Each element identifies a participant, user, group or booked resource as described in [[#Participant | participant table]].&lt;br /&gt;
|-&lt;br /&gt;
| 221 || users                    || Array        || Each element represents a participant as described in [[#UserParticipantObject | User participant object]]. User groups are resolved and are represented by their members. Any user can occur only once.&lt;br /&gt;
|-&lt;br /&gt;
| 222 || occurrences || Number || Specifies how often a recurrence should appear. May be present only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 223 || uid || String || Can only be written when the object is created. Internal and external globally unique identifier of the appointment or task. Is used to recognize appointments within iCal files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 224 || organizer || String || Contains the email address of the appointment organizer which is not necessarily an internal user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 225 || sequence || Number || iCal sequence number. Not implemented for tasks. Must be incremented on update. Will be incremented by the server, if not set.&lt;br /&gt;
|-&lt;br /&gt;
| 226 || confirmations || Array || Each element represents a confirming participant as described in [[#ConfirmingParticipant | confirming participant]]. This can be internal and external user. Not implemented for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| 227 || organizerId || Number || Contains the userIId of the appointment organizer if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 228 || principal || String || Contains the email address of the appointment principal which is not necessarily an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 229 || principalId || Number || Contains the userIId of the appointment principal if it is an internal user. Not implemented for tasks. (Introduced with 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 401 || full_time   || Boolean || True if the event is a whole day appointment or task, false otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Participant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant identifier&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || User ID&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 2 || user group&lt;br /&gt;
|-&lt;br /&gt;
| 3 || resource&lt;br /&gt;
|-&lt;br /&gt;
| 4 || resource group&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || mail address of an external participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UserParticipantObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | User participant object&lt;br /&gt;
! Name           !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id             || Number || User ID. Confirming for other users only works for appointments and not for tasks.&lt;br /&gt;
|-&lt;br /&gt;
| display_name   || String || Displayable name of the participant.&lt;br /&gt;
|-&lt;br /&gt;
| confirmation   || Number ||&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| confirmmessage || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConfirmingParticipant&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Confirming participant&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || Number || Type of participant:&lt;br /&gt;
{|&lt;br /&gt;
| 1 || user&lt;br /&gt;
|-&lt;br /&gt;
| 5 || external user&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| mail || String || email address of external participant&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || display name of external participant&lt;br /&gt;
|-&lt;br /&gt;
| status || Number ||&lt;br /&gt;
{|&lt;br /&gt;
| 0 || none&lt;br /&gt;
|-&lt;br /&gt;
| 1 || accepted&lt;br /&gt;
|-&lt;br /&gt;
| 2 || declined&lt;br /&gt;
|-&lt;br /&gt;
| 3 || tentative&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| message || String || Confirm Message of the participant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedTaskData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed task data&lt;br /&gt;
! ID  !! Name              !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 300 || status            || Number || Status of the task:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || not started&lt;br /&gt;
|-&lt;br /&gt;
| 2 || in progress&lt;br /&gt;
|-&lt;br /&gt;
| 3 || done&lt;br /&gt;
|-&lt;br /&gt;
| 4 || waiting&lt;br /&gt;
|-&lt;br /&gt;
| 5 || deferred&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 301 || percent_completed || Number || How much of the task is completed. An integer number between 0 and 100.&lt;br /&gt;
|-&lt;br /&gt;
| 302 || actual_costs|| Number || A monetary attribute to store actual costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 303 || actual_duration&lt;br /&gt;
|-&lt;br /&gt;
| 304 || after_complete || Date || Deprecated. Only present in AJAX interface. Value will not be stored on OX server.&lt;br /&gt;
|-&lt;br /&gt;
| 305 || billing_information&lt;br /&gt;
|-&lt;br /&gt;
| 307 || target_costs|| Number || A monetary attribute to store target costs of a task. Allowed values must be in the range -9999999999.99 and 9999999999.99.&lt;br /&gt;
|-&lt;br /&gt;
| 308 || target_duration&lt;br /&gt;
|-&lt;br /&gt;
| 309 || priority || Number || 1 = LOW, 2 = MEDIUM, 3 = HIGH&lt;br /&gt;
|-&lt;br /&gt;
| 312 || currency&lt;br /&gt;
|-&lt;br /&gt;
| 313 || trip_meter&lt;br /&gt;
|-&lt;br /&gt;
| 314 || companies&lt;br /&gt;
|-&lt;br /&gt;
| 315 || date_completed&lt;br /&gt;
|-&lt;br /&gt;
| 316 || start_time               || Date or Time || Inclusive start as Date for whole day tasks and Time for normal tasks. &lt;br /&gt;
|-&lt;br /&gt;
| 317 || end_time                 || Date or Time || Exclusive end as Date for whole day tasks and as Time for normal tasks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with task data. Each array element describes one task and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated tasks ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested tasks.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; – Which kinds of updates should be ignored. Omit this parameter or set it to &amp;quot;deleted&amp;quot; to not have deleted tasks identifier in the response. Set this parameter to &amp;quot;false&amp;quot; and the response contains deleted tasks identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted tasks. New and modified tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted tasks would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a task ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/tasks?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the task's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested task. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder Identifier through that the task is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated task.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated task. If the task was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
=== Create a task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Task object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created task.&lt;br /&gt;
&lt;br /&gt;
=== Delete task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An object in the field “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete tasks (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted tasks.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
Response: An array with object IDs of tasks which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Confirm task ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the to confirm task.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through that the task is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirm task.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot; and &amp;quot;confirmmessage&amp;quot; as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Search for tasks ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/tasks?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified , then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object with attributes described in [[#SearchTasks | Search tasks]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchTasks&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search tasks&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find tasks. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || (optional) Defines the folder to search for tasks in. If this is omitted in all task folders will be searched.&lt;br /&gt;
|-&lt;br /&gt;
| start || Date or Time || (optional) Inclusive start date for a time range the tasks should end in. If start is omitted end is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| end || Date or Time || (optional) Exclusive end date for a time range the tasks should end in. If this parameter is omitted the time range has an open end.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with matching tasks. Tasks are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;contacts&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The contacts module is used to access contact information.&lt;br /&gt;
&lt;br /&gt;
=== Get all contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried (optional from 6.22.2 on: If not set, the contents of all visible folders are used instead).&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedContactData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed contact data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 223 ||  || uid         || String || Can only be written when the object is created. Internal and external globally unique identifier of the contact. Is used to recognize contacts within vCard files. If this attribute is not written it contains an automatic generated UUID.&lt;br /&gt;
|-&lt;br /&gt;
| 500 || Display name                || display_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 501 || Given name                  || first_name           || String || First name.&lt;br /&gt;
|-&lt;br /&gt;
| 502 || Sur name                    || last_name            || String || Last name.&lt;br /&gt;
|-&lt;br /&gt;
| 503 || Middle name                 || second_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 504 || Suffix                      || suffix               || String&lt;br /&gt;
|-&lt;br /&gt;
| 505 || Title                       || title                || String&lt;br /&gt;
|-&lt;br /&gt;
| 506 || Street home                 || street_home          || String&lt;br /&gt;
|-&lt;br /&gt;
| 507 || Postal code home            || postal_code_home || String&lt;br /&gt;
|-&lt;br /&gt;
| 508 || City home                   || city_home            || String&lt;br /&gt;
|-&lt;br /&gt;
| 509 || State home                  || state_home           || String&lt;br /&gt;
|-&lt;br /&gt;
| 510 || Country home                || country_home         || String&lt;br /&gt;
|-&lt;br /&gt;
| 511 || Birthday                    || birthday             || Date&lt;br /&gt;
|-&lt;br /&gt;
| 512 || Marital status              || marital_status || String&lt;br /&gt;
|-&lt;br /&gt;
| 513 || Number of children          || number_of_children || String&lt;br /&gt;
|-&lt;br /&gt;
| 514 || Profession                  || profession           || String&lt;br /&gt;
|-&lt;br /&gt;
| 515 || Nickname                    || nickname             || String&lt;br /&gt;
|-&lt;br /&gt;
| 516 || Spouse name                 || spouse_name          || String&lt;br /&gt;
|-&lt;br /&gt;
| 517 || Anniversary                 || anniversary          || Date&lt;br /&gt;
|-&lt;br /&gt;
| 518 || Note                        || note                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 519 || Department                  || department           || String&lt;br /&gt;
|-&lt;br /&gt;
| 520 || Position                    || position             || String&lt;br /&gt;
|-&lt;br /&gt;
| 521 || Employee type               || employee_type  || String&lt;br /&gt;
|-&lt;br /&gt;
| 522 || Room number                 || room_number || String&lt;br /&gt;
|-&lt;br /&gt;
| 523 || Street business             || street_business      || String&lt;br /&gt;
|-&lt;br /&gt;
| 524 || Internal user id            || user_id || Number&lt;br /&gt;
|-&lt;br /&gt;
| 525 || Postal code business        || postal_code_business || String&lt;br /&gt;
|-&lt;br /&gt;
| 526 || City business               || city_business        || String&lt;br /&gt;
|-&lt;br /&gt;
| 527 || State business              || state_business       || String&lt;br /&gt;
|-&lt;br /&gt;
| 528 || Country business            || country_business     || String&lt;br /&gt;
|-&lt;br /&gt;
| 529 || Number of employee          || number_of_employees || String&lt;br /&gt;
|-&lt;br /&gt;
| 530 || Sales volume                || sales_volume || String&lt;br /&gt;
|-&lt;br /&gt;
| 531 || Tax id                      || tax_id               || String&lt;br /&gt;
|-&lt;br /&gt;
| 532 || Commercial register         || commercial_register  || String&lt;br /&gt;
|-&lt;br /&gt;
| 533 || Branches                    || branches             || String&lt;br /&gt;
|-&lt;br /&gt;
| 534 || Business category           || business_category    || String&lt;br /&gt;
|-&lt;br /&gt;
| 535 || Info                        || info                 || String&lt;br /&gt;
|-&lt;br /&gt;
| 536 || Manager's name              || manager_name         || String&lt;br /&gt;
|-&lt;br /&gt;
| 537 || Assistant's name            || assistant_name       || String&lt;br /&gt;
|-&lt;br /&gt;
| 538 || Street other                || street_other         || String&lt;br /&gt;
|-&lt;br /&gt;
| 539 || City other                  || city_other           || String&lt;br /&gt;
|-&lt;br /&gt;
| 540 || Postal code other           || postal_code_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 541 || Country other               || country_other        || String&lt;br /&gt;
|-&lt;br /&gt;
| 542 || Telephone business 1        || telephone_business1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 543 || Telephone business 2        || telephone_business2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 544 || FAX business                || fax_business         || String&lt;br /&gt;
|-&lt;br /&gt;
| 545 || Telephone callback          || telephone_callback   || String&lt;br /&gt;
|-&lt;br /&gt;
| 546 || Telephone car               || telephone_car        || String&lt;br /&gt;
|-&lt;br /&gt;
| 547 || Telephone company           || telephone_company    || String&lt;br /&gt;
|-&lt;br /&gt;
| 548 || Telephone home 1            || telephone_home1      || String&lt;br /&gt;
|-&lt;br /&gt;
| 549 || Telephone home 2            || telephone_home2      || String&lt;br /&gt;
|-&lt;br /&gt;
| 550 || FAX home                    || fax_home             || String&lt;br /&gt;
|-&lt;br /&gt;
| 551 || Cellular telephone 1        || cellular_telephone1  || String&lt;br /&gt;
|-&lt;br /&gt;
| 552 || Cellular telephone 2        || cellular_telephone2  || String&lt;br /&gt;
|-&lt;br /&gt;
| 553 || Telephone other             || telephone_other      || String&lt;br /&gt;
|-&lt;br /&gt;
| 554 || FAX other                   || fax_other            || String&lt;br /&gt;
|-&lt;br /&gt;
| 555 || Email 1                     || email1               || String&lt;br /&gt;
|-&lt;br /&gt;
| 556 || Email 2                     || email2               || String&lt;br /&gt;
|-&lt;br /&gt;
| 557 || Email 3                     || email3               || String&lt;br /&gt;
|-&lt;br /&gt;
| 558 || URL                         || url                  || String&lt;br /&gt;
|-&lt;br /&gt;
| 559 || Telephone ISDN              || telephone_isdn       || String&lt;br /&gt;
|-&lt;br /&gt;
| 560 || Telephone pager             || telephone_pager      || String&lt;br /&gt;
|-&lt;br /&gt;
| 561 || Telephone primary           || telephone_primary    || String&lt;br /&gt;
|-&lt;br /&gt;
| 562 || Telephone radio             || telephone_radio      || String&lt;br /&gt;
|-&lt;br /&gt;
| 563 || Telephone telex             || telephone_telex      || String&lt;br /&gt;
|-&lt;br /&gt;
| 564 || Telephone TTY/TDD           || telephone_ttytdd     || String&lt;br /&gt;
|-&lt;br /&gt;
| 565 || Instantmessenger 1          || instant_messenger1   || String&lt;br /&gt;
|-&lt;br /&gt;
| 566 || Instantmessenger 2          || instant_messenger2   || String&lt;br /&gt;
|-&lt;br /&gt;
| 567 || Telephone IP                || telephone_ip         || String&lt;br /&gt;
|-&lt;br /&gt;
| 568 || Telephone assistant         || telephone_assistant  || String&lt;br /&gt;
|-&lt;br /&gt;
| 569 || Company                     || company              || String&lt;br /&gt;
|-&lt;br /&gt;
| 570 ||                             || image1 || String&lt;br /&gt;
|-&lt;br /&gt;
| 571 || Dynamic Field 1             || userfield01 || String&lt;br /&gt;
|-&lt;br /&gt;
| 572 || Dynamic Field 2             || userfield02 || String&lt;br /&gt;
|-&lt;br /&gt;
| 573 || Dynamic Field 3             || userfield03 || String&lt;br /&gt;
|-&lt;br /&gt;
| 574 || Dynamic Field 4             || userfield04 || String&lt;br /&gt;
|-&lt;br /&gt;
| 575 || Dynamic Field 5             || userfield05 || String&lt;br /&gt;
|-&lt;br /&gt;
| 576 || Dynamic Field 6             || userfield06 || String&lt;br /&gt;
|-&lt;br /&gt;
| 577 || Dynamic Field 7             || userfield07 || String&lt;br /&gt;
|-&lt;br /&gt;
| 578 || Dynamic Field 8             || userfield08 || String&lt;br /&gt;
|-&lt;br /&gt;
| 579 || Dynamic Field 9             || userfield09 || String&lt;br /&gt;
|-&lt;br /&gt;
| 580 || Dynamic Field 10            || userfield10 || String&lt;br /&gt;
|-&lt;br /&gt;
| 581 || Dynamic Field 11            || userfield11 || String&lt;br /&gt;
|-&lt;br /&gt;
| 582 || Dynamic Field 12            || userfield12 || String&lt;br /&gt;
|-&lt;br /&gt;
| 583 || Dynamic Field 13            || userfield13 || String&lt;br /&gt;
|-&lt;br /&gt;
| 584 || Dynamic Field 14            || userfield14 || String&lt;br /&gt;
|-&lt;br /&gt;
| 585 || Dynamic Field 15            || userfield15 || String&lt;br /&gt;
|-&lt;br /&gt;
| 586 || Dynamic Field 16            || userfield16 || String&lt;br /&gt;
|-&lt;br /&gt;
| 587 || Dynamic Field 17            || userfield17 || String&lt;br /&gt;
|-&lt;br /&gt;
| 588 || Dynamic Field 18            || userfield18 || String&lt;br /&gt;
|-&lt;br /&gt;
| 589 || Dynamic Field 19            || userfield19 || String&lt;br /&gt;
|-&lt;br /&gt;
| 590 || Dynamic Field 20            || userfield20 || String || Contains a UUID if one was assigned (after 6.18.2)&lt;br /&gt;
|-&lt;br /&gt;
| 592 ||                             || distribution_list    || Array  || If this contact is a distribution list, then this field is an array of objects. Each object describes a member of the list as defined in [[#DistributionListMember | Distribution list member]].&lt;br /&gt;
|-&lt;br /&gt;
| 594 || Number of distributionlists || number_of_distribution_list || Number&lt;br /&gt;
|-&lt;br /&gt;
| 596 ||                             || number_of_images || Number&lt;br /&gt;
|-&lt;br /&gt;
| 597 ||                             || image_last_modified || Timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 598 || State other                 || state_other || String&lt;br /&gt;
|-&lt;br /&gt;
| 599 ||                             || file_as || String&lt;br /&gt;
|-&lt;br /&gt;
| 601 ||                             || image1_content_type || String&lt;br /&gt;
|-&lt;br /&gt;
| 602 ||                             || mark_as_distributionlist || Boolean&lt;br /&gt;
|-&lt;br /&gt;
| 605 || Default address             || default_address || Number&lt;br /&gt;
|-&lt;br /&gt;
| 606 ||                             || image1_url || String&lt;br /&gt;
|-&lt;br /&gt;
| 608 ||                             || useCount || Number || In case of sorting purposes the column 609 is also available, which places global address book contacts at the beginning of the result. If 609 is used, the order direction (ASC, DESC) is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 610 ||                             || yomiFirstName || String || Kana based representation for the First Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 611 ||                             || yomiLastName || String || Kana based representation for the Last Name. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 612 ||                             || yomiCompany || String || Kana based representation for the Company. Commonly used in japanese environments for searchin/sorting issues. (since 6.20)&lt;br /&gt;
|-&lt;br /&gt;
| 613 ||                             || addressHome || String || Support for Outlook 'home' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 614 ||                             || addressBusiness || String || Support for Outlook 'business' address field. (since 6.20.1)&lt;br /&gt;
|-&lt;br /&gt;
| 615 ||                             || addressOther || String || Support for Outlook 'other' address field. (since 6.20.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DistributionListMember&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Distribution list member&lt;br /&gt;
! Name       !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id         || String || Object ID of the member's contact if the member is an existing contact.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Parent folder ID of the member's contact if the member is an existing contact (preliminary, from 6.22 on).&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| mail       || String || Email address (mandatory before 6.22, afterwards optional if you are referring to an internal contact)&lt;br /&gt;
|-&lt;br /&gt;
| mail_field || Number || Which email field of an existing contact (if any) is used for the mail field.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0 || independent contact&lt;br /&gt;
|-&lt;br /&gt;
| 1 || default email field (email1)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || second email field (email2)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || third email field (email3)&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects. Each object contains fields “id” and “folder” of requested contacts.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=listuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with id&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
Available with SP4&lt;br /&gt;
&lt;br /&gt;
=== Get updated contacts ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested contacts.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted contacts. New and modified contacts are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted contacts (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get a contact ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the contact's folder.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Get contact by user ID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=getuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – User ID (not Object ID) of the requested user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested contact. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. &lt;br /&gt;
&lt;br /&gt;
Available with SP4 package.&lt;br /&gt;
&lt;br /&gt;
=== Update a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder identifier through that the contact is accessed. This is necessary for checking the permissions.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated contact.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated contact. If the contact was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
To remove some contact image send the image attribute set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To change or add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File_uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Create a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Contact object as described in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created contact.&lt;br /&gt;
&lt;br /&gt;
To add some contact image the PUT command must be replaced with a POST command and all data must be provided within a &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt; body. The normal request body must be placed into a form field named &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; while the image file must be placed in a file field named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. The response is then an HTML page as described in section [[#File uploads | File uploads]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a contact ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Delete contacts (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted contacts.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the fields “id” and “folder”.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected contacts with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchContacts | Search contacts]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContacts&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find contacts. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves. Matching is performed against any substring of the field &amp;lt;code&amp;gt;display_name&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search contacts with the given startletter. If this field is present, the pattern is matched against the contact field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|-&lt;br /&gt;
| folder || Array of Number || If a list of folder identifiers or at least a single folder identifier is given, only in that folders will be searched for contacts. This paramenter is optional but searching in all contact folders that are viewable and where objects can be read in is more expensive on that database than searching in a dedicated number of them. The possibility to provide here an array of folder identifier has been added with 6.10.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchContactsAlternative | Search contacts alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchContactsAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search contacts alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches contacts where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches contacts where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches contacts where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| email1 || String || Searches contacts where the email1 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email2 || String || Searches contacts where the email2 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| email3 || String || Searches contacts where the email3 address match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| company || String || Searches contacts where the company match with the given search pattern. (requires version &amp;gt;= 6.12)&lt;br /&gt;
|-&lt;br /&gt;
| categories || String || Searches contacts where the categories match with the given search pattern. &lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, a contact is returned if any specified pattern matches at the start of the corresponding field. Otherwise, a contact is returned if all specified patterns match any substring of the corresponding field.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed as if orSearch were set to true. The actual value of orSearch is ignored.&lt;br /&gt;
|-&lt;br /&gt;
| exactMatch || Boolean || If set to true, contacts are returned where the specified patterns match the corresponding fields exactly. Otherwise, a 'startsWith' or 'substring' comparison is used based on the 'orSearch' parameter. (requires version &amp;gt; 6.22.1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by filter (since 6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/contacts?action=advancedSearch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (preliminary, since 6.20) – allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#Module_.22search.22_.28alternative_suggestion.2C_still_preliminary.29 | Search Filter]]&lt;br /&gt;
&lt;br /&gt;
Response: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by anniversary (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose anniversary falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=anniversaries&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their anniversary in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Search contacts by birthday (Since 6.22.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts whose birthday falls into a timerange.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=birthdays&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If not specified, the results are sorted ascending by their birthday in the supplied timerange. If this parameter is specified, then the parameter order must be also specified. &lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Auto-complete contacts (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
Find contacts based on a prefix, usually used to auto-complete e-mail recipients while the user is typing.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/contacts?action=autocomplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; – The query to search for.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional)  – Object ID of the parent folder that is searched. If not set, all visible folders are used.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; (optional)  – Whether to only include contacts with at least one e-mail address. Defaults to &amp;quot;true&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. Since 7.8.1: If this parameter is missing, response is sorted by a user-specific use count of contacts, ID of contacts' parent folder and display name.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is &lt;br /&gt;
* &amp;lt;code&amp;gt;collation&amp;lt;/code&amp;gt; (optional)  – Allows you to specify a collation to sort the contacts by. As of 6.20, only supports &amp;quot;gbk&amp;quot; and &amp;quot;gb2312&amp;quot;, not needed for other languages. Parameter &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; should be set for this to work.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; (optional) – A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with contact data. Each array element describes one contact and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;calendar&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The calendar module is used to access calendar data.&lt;br /&gt;
&lt;br /&gt;
=== Get all appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) – Object ID of the folder, whose contents are queried. If not specified, defaults to all calendar folders.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which start on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which end before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Appointment sequencies are broken up into individual appointments and each occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedAppointmentData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed appointment data&lt;br /&gt;
! ID  !! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 206 || recurrence_id            || Number       || Object ID of the entire appointment sequence. Present on series and change exception appointments. Equals to object identifier on series appointment and is different to object identifier on change exceptions.&lt;br /&gt;
|-&lt;br /&gt;
| 207 || recurrence_position      || Number       || 1-based position of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 208 || recurrence_date_position || Date         || Date of an individual appointment in a sequence. Present if and only if recurrence_type &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 210 || change_exceptions                     || Array       || An array of Dates, representing all change exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 211 || delete_exceptions                     || Array       || An array of Dates, representing all delete exceptions of a sequence.&lt;br /&gt;
|-&lt;br /&gt;
| 400 || location    || String  || Location&lt;br /&gt;
|-&lt;br /&gt;
| 402 || shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 408 || timezone    || String  || Timezone&lt;br /&gt;
|-&lt;br /&gt;
| 410 || recurrence_start    || Date  || Start of a sequence without time&lt;br /&gt;
|-&lt;br /&gt;
|  || ignore_conflicts || Boolean  || Ignore soft conflicts for the new or modified appointment. This flag is valid for the current change only, i. e. it is not stored in the database and is never sent by the server to the client. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get appointment information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=has&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response is an array of booleans. Array length is the number of days. Each entry in the array corresponds with one day in the range that was queried, explaining whether there is an appointment on this day or not.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with full object IDs (folder, id and optionally either recurrence_position or recurrence_date_position) of requested appointments.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an appointment&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| pos  || Number || Value of the field recurrence_position, if present in the appointment.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get updated appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried. That parameter may be absent in case &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is set to &amp;quot;deleted&amp;quot;, which means all accessible calendar folders are considered. If  &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; is not set to &amp;quot;deleted&amp;quot;, that parameter is mandatory.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested appointments.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&amp;lt;br&amp;gt;This parameter is optional in case a certain folder is queried, but mandatory if all accessible calendar folders are supposed to be considered (&amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; not specified)&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (mandatory - should be set to &amp;quot;deleted&amp;quot;) (deprecated) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_master&amp;lt;/code&amp;gt; – Extract the recurrence to several appointments. The default value is false so every appointment of the recurrence will be calculated.&lt;br /&gt;
* &amp;lt;code&amp;gt;showPrivate&amp;lt;/code&amp;gt; (optional) – only works in shared folders: When enabled, shows private appointments of the folder owner. Such appointments are anonymized by stripping away all information except start date, end date and recurrence information (since 6.18)&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted appointments. New and modified appointments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted appointments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by objects described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]] instead of arrays. Appointment sequencies are broken up into individual appointments and each modified occurrence of a sequence in the requested range is returned separately. The appointments are sorted in ascending order by the field start_date.&lt;br /&gt;
&lt;br /&gt;
=== Get an appointment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;recurrence_position&amp;lt;/code&amp;gt; (optional) – Recurrence Position requested appointment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested appointment. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Update an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated appointment.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the appointment's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated appointment. If the appointment was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field recurrence_id is always present if it is present in the original appointment. The field recurrence_position is present if it is present in the original appointment and only this single appointment should be modified. The field id is not present because it is already included as a parameter. Other fields are present only if modified.&lt;br /&gt;
&lt;br /&gt;
=== Create an appointment ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Appointment object as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[#DetailedAppointmentData | Detailed appointment data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: If the appointment was created successfully, an object with the attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created appointment. If the appointment could not be created due to conflicts, the response body is an object with the field &amp;lt;code&amp;gt;conflicts&amp;lt;/code&amp;gt;, which is an array of appointment objects which caused the conflict. Each appointment object which represents a resource conflict contains an additional field &amp;lt;code&amp;gt;hard_conflict&amp;lt;/code&amp;gt; with the Boolean value true. If the user does not have read access to a conflicting appointment, only the fields &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;end_date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shown_as&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; are present and the field &amp;lt;code&amp;gt;participants&amp;lt;/code&amp;gt; contains only the participants which caused the conflict.&lt;br /&gt;
&lt;br /&gt;
=== Delete an appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: The appointment object to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Delete appointments (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of appointment objects to delete. The fields for the object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]]. &lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which were modified after the specified timestamp and were therefore not deleted. The fields of each object are described in [[#FullIdentifierForAnAppointment | Full identifier for an appointment]].&lt;br /&gt;
&lt;br /&gt;
=== Confirm appointment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the appointment to confirm.&lt;br /&gt;
* &amp;lt;code&amp;gt;occurrence&amp;lt;/code&amp;gt; – The numeric identifier of the occurrence to which the confirmation applies (in case &amp;quot;id&amp;quot; denotes a series appointment). Available with v7.6.0&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the folder through which the appointment is accessed.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the to confirmed appointment.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the fields &amp;quot;confirmation&amp;quot;, &amp;quot;confirmmessage&amp;quot; and &amp;quot;id&amp;quot; (optional) as described in [[#UserParticipantObject | User participant object]].&lt;br /&gt;
&lt;br /&gt;
Response: Nothing, except the standard response object with empty data, the timestamp of the confirmed and thereby updated task, and maybe errors.&lt;br /&gt;
&lt;br /&gt;
=== Free &amp;amp; Busy ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=freebusy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - Internal user id. Must be obtained from the contact module.&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; - Constant for user or resource (1 for users, 3 for resources)&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
&lt;br /&gt;
Response: An array of objects identifying the appointments which lie between start and end as described.&amp;lt;br&amp;gt;&lt;br /&gt;
This objects consist of:&lt;br /&gt;
{| id=&amp;quot;FreeAndBusyAppointment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number  || Describes, how this appointment appears in availability queries:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| start_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|- &lt;br /&gt;
| end_date || Date or Time || see [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]]&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || String || Folder ID. Only set, if the user has the right to see the object. (added 2009-08-18/6.12) &lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean || True if the appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Search appointments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/calendar?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchAppointments&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search appointments&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find appointments. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search appointments with the given starting letter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchAppointments | Search appointments]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get new appointments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=newappointments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; – Lower inclusive limit of the queried range as a Date. Only appointments which end on or after this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – Upper exclusive limit of the queried range as a Date. Only appointments which start before this date are returned.&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; – limits the number of returned object to the given value.&lt;br /&gt;
&lt;br /&gt;
Response: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Resolve UID ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=resolveuid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The UID to be resolved.&lt;br /&gt;
&lt;br /&gt;
Response: An object object with the field &amp;quot;id&amp;quot; containing the ox-object id, if existing, an error message otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Get all Change Exceptions (Since v7.2.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/calendar?action=getChangeExceptions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object id of the appointment series.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Folder ID of the requested appointments. &lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with appointment data. Each array element describes one appointment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The mail module is used to access mail data.&lt;br /&gt;
&lt;br /&gt;
When mails are stored on an IMAP server, some functionality is not available due to restrictions of the IMAP protocol. Such functionality is marked with &amp;quot;not IMAP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Get mail count ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=count&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder whose mail count is queried&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An integer value representing folder's mail count&lt;br /&gt;
&lt;br /&gt;
=== Get all mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedMailData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed mail data&lt;br /&gt;
! ID  !! Name                 !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 102 || color_label || Number || Color number used by Outlook to label the object. The assignment of colors to numbers is arbitrary and specified by the client. The numbers are integer numbers between 0 and 10 (inclusive).&lt;br /&gt;
|-&lt;br /&gt;
| 600 || id                   || String  || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| 601 || folder_id            || String  || Object ID of the parent folder&lt;br /&gt;
|-&lt;br /&gt;
| 602 || attachment           || Boolean || Specifies whether this mail has attachments.&lt;br /&gt;
|-&lt;br /&gt;
| 603 || from                 || Array   || Each element is a two-element array specifying one sender. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values.&lt;br /&gt;
|-&lt;br /&gt;
| 604 || to                   || Array   || Each element is a two-element array (see the from field) specifying one receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 605 || cc                   || Array   || Each element is a two-element array (see the from field) specifying one carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 606 || bcc                  || Array   || Each element is a two-element array (see the from field) specifying one blind carbon-copy receiver.&lt;br /&gt;
|-&lt;br /&gt;
| 607 || subject              || String  || Subject line.&lt;br /&gt;
|-&lt;br /&gt;
| 608 || size                 || Number  || Size of the mail in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 609 || sent_date            || Time    || Date and time as specified in the mail by the sending client.&lt;br /&gt;
|-&lt;br /&gt;
| 610 || received_date        || Time    || Date and time as measured by the receiving server.&lt;br /&gt;
|-&lt;br /&gt;
| 611 || flags                || Number  || Various system flags. A sum of zero or more of following values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1  || answered&lt;br /&gt;
|-&lt;br /&gt;
| 2  || deleted&lt;br /&gt;
|-&lt;br /&gt;
| 4  || draft&lt;br /&gt;
|-&lt;br /&gt;
| 8  || flagged&lt;br /&gt;
|-&lt;br /&gt;
| 16 || recent&lt;br /&gt;
|-&lt;br /&gt;
| 32 || seen&lt;br /&gt;
|-&lt;br /&gt;
| 64 || user&lt;br /&gt;
|-&lt;br /&gt;
| 128 || spam&lt;br /&gt;
|-&lt;br /&gt;
| 256 || forwarded&lt;br /&gt;
|}&lt;br /&gt;
See javax.mail.Flags.Flag for details.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || level                || Number  || Zero-based nesting level in a thread.&lt;br /&gt;
|-&lt;br /&gt;
| 613 || disp_notification_to || String  || Content of message's header “Disposition-Notification-To”&lt;br /&gt;
|-&lt;br /&gt;
| 614 || priority             || Number  || Value of message's “X-Priority” header:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 0   || No priority&lt;br /&gt;
|-&lt;br /&gt;
| 5   || Very Low&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Low&lt;br /&gt;
|-&lt;br /&gt;
| 3   || Normal&lt;br /&gt;
|-&lt;br /&gt;
| 2   || High&lt;br /&gt;
|-&lt;br /&gt;
| 1   || Very High&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 615  || msg_ref                 || String  || Message reference on reply/forward.&lt;br /&gt;
|-&lt;br /&gt;
| 651  || flag_seen                 || String  || Special field to sort mails by seen status&lt;br /&gt;
|-&lt;br /&gt;
| 652  || account_name                 || String  || Message's account name.&lt;br /&gt;
|-&lt;br /&gt;
| 653  || account_id                 || int  || Message's account identifier. Since v6.20.2&lt;br /&gt;
|-&lt;br /&gt;
|     || user                 || Array  || An array with user-defined flags as strings.&lt;br /&gt;
|-&lt;br /&gt;
|     || headers                 || Object  || An object with a field for every non-standard header. The header name is the field name. The header value is the value of the field as string.&lt;br /&gt;
|-&lt;br /&gt;
|     || attachments          || Array   || Each element is an attachment as described in [[#Attachment | Attachment]]. The first element is the mail text. If the mail has multiple representations (multipart-alternative), then the alternatives are placed after the mail text and have the field disp set to alternative.&lt;br /&gt;
|-&lt;br /&gt;
|     || nested_msgs          || Array   || Each element is a mail object as described in this table, except for fields id, folder_id and attachment.&lt;br /&gt;
|-&lt;br /&gt;
|     || truncated          || boolean   || true/false if the mail content was trimmed. Since v7.6.1&lt;br /&gt;
|-&lt;br /&gt;
|     || source             || String    || RFC822 source of the mail. Only present for &amp;lt;tt&amp;gt;action=get&amp;amp;attach_src=true&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|     || cid                || String    || The value of the &amp;quot;Content-ID&amp;quot; header, if the header is present.&lt;br /&gt;
|-&lt;br /&gt;
| 654  || original_id                 || String  || The original mail identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|-&lt;br /&gt;
| 655  || original_folder_id                 || String  || The original folder identifier (e.g. if fetched from &amp;quot;virtual/all&amp;quot; folder).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Attachment&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || String || Object ID (unique only inside the same message)&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || MIME type&lt;br /&gt;
|-&lt;br /&gt;
| content      || String || Content as text. Present only if easily convertible to text.&lt;br /&gt;
|-&lt;br /&gt;
| filename     || String || Displayed filename (mutually exclusive with content).&lt;br /&gt;
|-&lt;br /&gt;
| size         || Number || Size of the attachment in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| disp         || String || Attachment's disposition: null, inline, attachment or alternative.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all mail conversations (since v7.x) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=threadedAll&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;includeSent&amp;lt;/code&amp;gt; - A boolean value to signal that conversations also include messages taken from special &amp;quot;sent&amp;quot; aka &amp;quot;sent items&amp;quot; folder&lt;br /&gt;
* &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;right-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; - A positive integer number to specify the &amp;quot;left-hand&amp;quot; limit of the range to return. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - A positive integer number to specify how many items shall be returned according to given sorting; overrides &amp;lt;code&amp;gt;left_hand_limit&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;right_hand_limit&amp;lt;/code&amp;gt; parameters and is equal to &amp;lt;code&amp;gt;left_hand_limit=0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;right_hand_limit=&amp;amp;lt;limit&amp;amp;gt;&amp;lt;/code&amp;gt;. &amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt;: Applies only to root-level messages.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON array consisting of JSON objects, each representing a conversation's root message along with its message thread. The root message's JSON object is filled according to specified columns and is enhanced by special &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field representing the full message thread (including the root message itself). The &amp;lt;code&amp;gt;&amp;quot;thread&amp;quot;&amp;lt;/code&amp;gt; JSON field is a JSON array of JSON objects; each representing a message in the conversation sorted by time-line, also filled with specified columns. E.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
   &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
   &amp;quot;unreadCount&amp;quot;:0,&lt;br /&gt;
   &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
   &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
   &amp;quot;thread&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263852&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263853&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;26323&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/Sent&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;263854&amp;quot;,&lt;br /&gt;
         &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
         &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
         &amp;quot;color_label&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Search mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for appointments are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response or the string “thread” to return thread-sorted messages. If this parameter is specified and holds a column number, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON array of JSON objects each containing the search field and its search pattern: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;col&amp;quot;: 612, &amp;quot;pattern&amp;quot;: &amp;quot;Joe&amp;quot;}, {&amp;quot;col&amp;quot;: 614, &amp;quot;pattern&amp;quot;: &amp;quot;Tuesday&amp;quot;}]&amp;lt;/code&amp;gt; Supported values for &amp;lt;code&amp;gt;col&amp;lt;/code&amp;gt; are 603 to 607 (from, to, cc, bcc and subject) and -1 for full text search.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;headers&amp;lt;/code&amp;gt; - (preliminary) A comma-separated list of header names. Each name requests denoted header from each mail&lt;br /&gt;
&lt;br /&gt;
Request body: An array with one object for each requested mail. Each object contains the fields &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An array with mail data. Each array element describes one mail and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter followed by requested headers.&lt;br /&gt;
&lt;br /&gt;
=== Copy mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the copied mail&lt;br /&gt;
&lt;br /&gt;
=== Move mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the source folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the id of the destination folder inside the &amp;quot;folder_id&amp;quot; field: e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;folder_id&amp;quot;: 1376}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the ID of the moved mail&lt;br /&gt;
&lt;br /&gt;
=== Update mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
'''Note''': If neither parameter &amp;quot;&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&amp;quot; nor parameter &amp;quot;&amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt;&amp;quot; is specified, all folder's messages are updated accordingly. Available with v6.20.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object which carries the new values that ought to be applied to mail as described in [[#UpdateMail | Update mail]] or [[#UpdateMailExtended | Update mail extended]] (available with SP6 v6.10).&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the Object ID of the updated mail and its folder.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMail&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| color_label || Number || The color number between 0 and 10.&lt;br /&gt;
|-&lt;br /&gt;
| flags || Number || A set of flags to add or remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| value || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to add the flags specified by &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (logical OR), &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to remove them (logical AND with the inverted value).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;UpdateMailExtended&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Update mail extended (available with SP6 v6.10)&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| set_flags || Number || A set of flags to add. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| clear_flags || Number || A set of flags to remove. Note: Flags for &amp;quot;recent&amp;quot; (8) and &amp;quot;user&amp;quot; (64) are ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mark all mails as seen (available with v7.6.0) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=all_seen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder.&lt;br /&gt;
&lt;br /&gt;
Request Body: n.a.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Not IMAP: Get updated mails ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: Just an empty JSON array is going to be returned since this action cannot be applied to IMAP.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested mail.&lt;br /&gt;
* &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt; – (Preliminary) The value of &amp;quot;Message-Id&amp;quot; header of the requested mail. This parameter is a substitute for &amp;quot;id&amp;quot; parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the mail's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; (optional) – 1 indicates that this request should fill the message compose dialog to edit a message and thus display-specific date is going to be withheld.&lt;br /&gt;
* &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain only the (formatted) message headers as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; (optional) – 1 to let the response contain the complete message source as plain text&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; (optional) – 1 to write the complete message source to output stream. '''NOTE:''' This parameter will only be used if parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; is set to 1.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP4)&lt;br /&gt;
** &amp;quot;raw&amp;quot; returns the content as it is, meaning no preparation are performed and thus no guarantee for safe contents is given (available with SP6 v6.10).&lt;br /&gt;
** &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML.&lt;br /&gt;
** &amp;quot;textNoHtmlAttach&amp;quot; is the same as &amp;quot;text&amp;quot;, but does not deliver the HTML part as attachment in case of multipart/alternative content.&lt;br /&gt;
** &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).&lt;br /&gt;
** &amp;quot;noimg&amp;quot; to allow a possible HTML content being transferred but without original image src attributes which references external images: Can be used to prevent loading external linked images (spam privacy protection).&lt;br /&gt;
** '''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;unseen&amp;lt;/code&amp;gt; (optional) – &amp;quot;1&amp;quot; or &amp;quot;true&amp;quot; to leave an unseen mail as unseen although its content is requested&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
* &amp;lt;code&amp;gt;attach_src&amp;lt;/code&amp;gt; (optional - available since v7.6.1) 1 to let the JSON mail representation being extended by &amp;lt;code&amp;gt;&amp;quot;source&amp;quot;&amp;lt;/code&amp;gt; field containing the mail raw RFC822 source data&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An JSON object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included. '''NOTE:''' Of course response is not a JSON object if either parameter &amp;lt;code&amp;gt;hdr&amp;lt;/code&amp;gt; or parameter &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; are set to &amp;quot;1&amp;quot;. Then the response contains plain text. Moreover if optional parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to &amp;quot;1&amp;quot; the complete message source is going to be directly written to output stream to open browser's save dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mails as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_messages&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; –  A comma-separated list of Object IDs of the requested mails&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=attachment&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – ID of the requested attachment '''OR'''&lt;br /&gt;
* &amp;lt;code&amp;gt;cid&amp;lt;/code&amp;gt; – Value of header 'Content-ID' of the requested attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; – 1 overwrites the defined mimetype for this attachment to force the download dialog, otherwise 0.&lt;br /&gt;
* &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt; (optional) – 1 to apply HTML white-list filter rules if and only if requested attachment is of MIME type &amp;lt;code&amp;gt;text/htm*&amp;lt;/code&amp;gt; '''AND''' parameter &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; is set to 0.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this attachment, except the parameter save is set to 1.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple mail attachments as a ZIP file ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=zip_attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The folder identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the mail which contains the attachments.&lt;br /&gt;
* &amp;lt;code&amp;gt;attachment&amp;lt;/code&amp;gt; – A comma-separated list of IDs of the requested attachments&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP file.&lt;br /&gt;
&lt;br /&gt;
=== Send a mail ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;lineWrapAfter&amp;lt;/code&amp;gt; – An integer value specifying the line-wrap setting (only effective for plain-text content); if absent the setting is taken from user's mail settings. Available with v7.8.1.&lt;br /&gt;
&lt;br /&gt;
Request Body: This method uses the encoding multipart/form-data or multipart/mixed.&lt;br /&gt;
* The form filed &amp;lt;code&amp;gt;json_0&amp;lt;/code&amp;gt; contains the rudimentary mail as JSON object as described in [[#DetailedMailData | Detailed mail data]] with just its message body (as html content) defined in nested JSON array &amp;quot;attachments&amp;quot; and its header data (from, to, subject, etc.). The field &amp;quot;content_type&amp;quot; defines whether the mail ought to be sent as plain text (&amp;quot;text/plain&amp;quot;), as html (&amp;quot;text/html&amp;quot;) or  as multipart/alternative (&amp;quot;ALTERNATIVE&amp;quot;). Sending a mail requires some special fields inside JSON mail object. The field &amp;quot;infostore_ids&amp;quot; defines a JSON array of infostore document ID(s) that ought to be appended to this mail as attachments. The field &amp;quot;msgref&amp;quot; indicates the ID of the referenced original mail. Moreover the field &amp;quot;sendtype&amp;quot; indicates the type of the message:&lt;br /&gt;
** 0 - A normal new mail (optional)&lt;br /&gt;
** 1 - A reply mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 2 - A forward mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 3 - A draft edit operation. The field &amp;quot;msgref&amp;quot; must be present in order to delete previous draft message since e.g. IMAP does not support changing/replacing a message but requires a delete-and-insert sequence&lt;br /&gt;
** 4 - Transport of a draft mail. The field &amp;quot;msgref&amp;quot; must be present&lt;br /&gt;
** 6 - This type signals that user intends to send out a saved draft message and expects the draft message (referenced by &amp;quot;msgref&amp;quot; field) being deleted after successful transport&lt;br /&gt;
Example of a normal new mail which appends user's VCard and requests a read receipt from receiver:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Content-Disposition: form-data; name=&amp;quot;json_0&amp;quot;....{&amp;quot;from&amp;quot;:&amp;quot;\u0022Muster, Karl\u0022 &amp;lt;karl.muster@somewhere.com&amp;gt;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;someone@somewhere.com&amp;quot;,&amp;quot;cc&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bcc&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;subject&amp;quot;:&amp;quot;Mail Subject&amp;quot;,&amp;quot;priority&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;disp_notification_to&amp;quot;:true,&amp;quot;vcard&amp;quot;:1,&lt;br /&gt;
&amp;quot;attachments&amp;quot;:[{&amp;quot;content_type&amp;quot;:&amp;quot;ALTERNATIVE&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;Simple Mail Text!&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;\u000a\u000a&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* The request accepts file fields in upload form that denote referenced files that are going to be appended as attachments&lt;br /&gt;
* For &amp;quot;text/plain&amp;quot; mail bodies, the JSON boolean field &amp;quot;raw&amp;quot; may be specified inside the body's JSON representation to signal that the text content shall be kept as-is; meaning to keep all formatting intact&lt;br /&gt;
&lt;br /&gt;
==== Attach data sources ====&lt;br /&gt;
Moreover the JSON representation may contain data sources which should be appended as file attachments to the mail. Then the mail contains the &amp;lt;code&amp;gt;&amp;quot;datasources&amp;quot;&amp;lt;/code&amp;gt; key which is expected to be a JSON array of data source descriptions.&lt;br /&gt;
&lt;br /&gt;
A data source description follows the [[#Module_.22conversion.22_.28preliminary.29 | conversion specification]].&lt;br /&gt;
&lt;br /&gt;
For example to attach a file through an URL the field looks like this (available with v6.18.2):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;from&amp;quot;: &amp;quot;someone@somewhere.com,&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;quot;datasources&amp;quot;&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;identifier&amp;quot;: &amp;quot;com.openexchange.url.mail.attachment&amp;quot;,&lt;br /&gt;
   &amp;quot;args&amp;quot;:&lt;br /&gt;
    {&lt;br /&gt;
     &amp;quot;url&amp;quot;: &amp;lt;url-string&amp;gt;,&lt;br /&gt;
     &amp;quot;timeout&amp;quot;: &amp;lt;optional-timeout-millis-int, default is 2500msec&amp;gt;,&lt;br /&gt;
     &amp;quot;contentType&amp;quot;: &amp;lt;optional-content-type-string&amp;gt;,&lt;br /&gt;
     &amp;quot;charset&amp;quot;: &amp;lt;optional-charset-string&amp;gt;,&lt;br /&gt;
     &amp;quot;size&amp;quot;: &amp;lt;optional-size-int&amp;gt;,&lt;br /&gt;
     &amp;quot;disposition&amp;quot;: &amp;lt;optional-disposition-string&amp;gt;,&lt;br /&gt;
     &amp;quot;fileName&amp;quot;: &amp;lt;optional-file-name-string&amp;gt;,&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created mail.&lt;br /&gt;
&lt;br /&gt;
=== Send/Save mail as MIME data block (RFC822) (added in SP5) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; (optional) - In case the mail should not be sent out, but saved in a specific folder, the &amp;quot;folder&amp;quot; parameter can be used. If the mail should be sent out to the recipient, the &amp;quot;folder&amp;quot; parameter must not be included and the mail is stored in the folder &amp;quot;Sent Items&amp;quot;. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. If no &amp;quot;folder&amp;quot;  parameter is specified, this parameter must not be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
 &lt;br /&gt;
Request Body: The MIME Data Block&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created/moved mail.&lt;br /&gt;
&lt;br /&gt;
=== Import of mails as MIME data block (RFC822) (added with 6.18) ===&lt;br /&gt;
&lt;br /&gt;
This request can be used to store a single or a lot of mails in the OX mail storage backend. This action should be used instead of &amp;lt;code&amp;gt;action=new&amp;lt;/code&amp;gt; because it is faster and tolerant to 8bit encoded emails.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /ajax/mail?action=import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - For the import this parameter is required to specify the folder into that the emails should be imported. Example &amp;quot;folder=default.INBOX/Testfolder&amp;quot;&lt;br /&gt;
* &amp;lt;code&amp;gt;flags&amp;lt;/code&amp;gt; (optional) - In case the mail should be stored with status &amp;quot;read&amp;quot; (e.g. mail has been read already in the client inbox), the parameter &amp;quot;flags&amp;quot; has to be included. For infos about mail flags see [[#DetailedMailData | Detailed mail data]] spec.&lt;br /&gt;
*&amp;lt;code&amp;gt;force&amp;lt;/code&amp;gt; (optional) - If this parameter is set to true, the server skips checking the valid From-address&lt;br /&gt;
 &lt;br /&gt;
Request Body: A multipart/form-data with a single or multiple file parts each having a different name and containing the RFC822 encoded email as binary data like in a file upload.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the folder identifier and the object identifier of the imported mail or a JSON array of those JSON objects if multiple mails are imported.&lt;br /&gt;
&lt;br /&gt;
=== Reply/Forward a mail ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/mail?action=forward&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested Message.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; - Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; (optional - available with SP6) - &amp;quot;text&amp;quot; forces the server to deliver a text-only version of the requested mail's body, even if content is HTML. &amp;quot;html&amp;quot; to allow a possible HTML mail body being transferred as it is (but white-list filter applied).'''NOTE:''' if set, the corresponding gui config setting will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;setFrom&amp;lt;/code&amp;gt; (optional - available since v7.6.0) A flag (&amp;quot;true&amp;quot;/&amp;quot;false&amp;quot;) that signals if &amp;quot;From&amp;quot; header shall be pre-selected according to a suitable recipient address that matches one of user's E-Mail address aliases; only supported for &amp;lt;code&amp;gt;/ajax/mail?action=replyall&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/ajax/mail?action=reply&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;max_size&amp;lt;/code&amp;gt; (optional - available since v7.6.1) A positive integer number (greater than 10000) to specify how many characters of the message content will be returned. If the number is smaller than 10000 the value will be ignored and 10000 used.&lt;br /&gt;
&lt;br /&gt;
Response (not IMAP: with timestamp): An object containing all data of the requested mail. The fields of the object are listed in [[#DetailedMailData | Detailed mail data]]. The fields id and attachment are not included.&lt;br /&gt;
&lt;br /&gt;
=== Delete mails ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects providing folder IDs and object IDs of the deleted mails.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/INBOX&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;123&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;{&amp;amp;nbsp;&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;default0/MyFolder&amp;amp;quot;,&amp;amp;nbsp;&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;134&amp;amp;quot;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not IMAP: Response: An array with object IDs of mails which were modified after the specified timestamp and were therefore not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Clear mail folder(s) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=clear&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* Not IMAP: &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted mails.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with IDs of the mail folders to clear&lt;br /&gt;
&lt;br /&gt;
Response: An array with IDs of mail folder that could not be cleared; meaning the response body is an empty JSON array if everything went well.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge receipt ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/mail?action=receipt_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request Body: A JSON object containing the &amp;quot;from address&amp;quot;, the id of the folder and the mail id: e.g.: {&amp;quot;from&amp;quot;:&amp;quot;mymail@domain.com&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;1234&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object with an empty data field if everything went well or a JSON object containing the error information.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;groups&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The group module allows to query available groups. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get a group ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The group id.&lt;br /&gt;
&lt;br /&gt;
Response: A group object as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== List groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with group identifiers.&lt;br /&gt;
&lt;br /&gt;
Response: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
=== Search for groups ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#GroupSearch | Group search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find groups. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array of group objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;GroupData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Group data&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name         || String || Name with character restrictions&lt;br /&gt;
|-&lt;br /&gt;
| members       || Array  || The array contains identifier of users that are member of the group.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: A json objekt with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created group.&lt;br /&gt;
&lt;br /&gt;
=== Delete a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the group to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the group.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the group was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a group ===&lt;br /&gt;
&lt;br /&gt;
introduced 2008-06-12&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/group?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the group to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the group to update. If the group was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Group object as described in [[#GroupData | Group data]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/group?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested groups.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted groups. New, modified and deleted groups are represented by JSON objects as described in [[#GroupData | Group data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;resource&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The resource module allows to query available resources. It is mainly used by the dialog for the selection of participants.&lt;br /&gt;
&lt;br /&gt;
=== Get all resources ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource identifier.&lt;br /&gt;
&lt;br /&gt;
=== List resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An array with resources ids.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Get a resource ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The resource id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
=== Search for resources ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with search parameters  as described in [[#ParticipantSearch | Participant search]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ParticipantSearch&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Participant search&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find resources. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array of resource objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ResourceResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Resource Response&lt;br /&gt;
! Name         !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number || ID&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Display name&lt;br /&gt;
|-&lt;br /&gt;
| name || String || internal name&lt;br /&gt;
|-&lt;br /&gt;
| mailaddress || String || email address&lt;br /&gt;
|-&lt;br /&gt;
| availability || Boolean || can be false to mark the resource currently unavailable&lt;br /&gt;
|-&lt;br /&gt;
| description || String || description of the resource&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || Date and time of the last modification.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified_utc || Timestamp || Date and time of the last modification.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. The field id is not present.&lt;br /&gt;
&lt;br /&gt;
Response: An object with attribute &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the newly created resource.&lt;br /&gt;
&lt;br /&gt;
=== Delete a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resource was deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Delete resources (since v6.22) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the resource to delete.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id” containing the unique identifier of the resource.&lt;br /&gt;
&lt;br /&gt;
Response: An empty json array if the resources were deleted successfully.&lt;br /&gt;
&lt;br /&gt;
=== Change a resource ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/resource?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the resource to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Time stamp of the resource to update. If the resource was modified after the specified time stamp, then the update must fail. &lt;br /&gt;
&lt;br /&gt;
Request body: Resource object as described in [[#ResourceResponse | Resource response]]. Only modified fields are present and the field id is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Get updates (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
introduced 2010-09-13&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/resource?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested resources.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted resources. New, modified and deleted resources are represented by JSON objects as described in [[#ResourceResponse | Resource response]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;infostore&amp;quot; or &amp;quot;Filestore&amp;quot; or &amp;quot;Files&amp;quot; or &amp;quot;Drive&amp;quot; ==&lt;br /&gt;
This module has been renamed quite often. Whatever its name, it combines the knowledge database, bookmarks and document storage.&lt;br /&gt;
&lt;br /&gt;
=== Get all infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedInfoitemData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed infoitem data&lt;br /&gt;
! ID  !! Name            !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 108 || object_permissions           || Array  || Each element is an object described in [[#ObjectPermissionObject | Object Permission object]] (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 109 || shareable       || Boolean || (read-only) Indicates if the item can be shared (preliminary, available with 7.8.0).&lt;br /&gt;
|-&lt;br /&gt;
| 700 || title           || String  || Title&lt;br /&gt;
|-&lt;br /&gt;
| 701 || url             || String  || Link/URL&lt;br /&gt;
|-&lt;br /&gt;
| 702 || filename        || String  || Displayed filename of the document.&lt;br /&gt;
|-&lt;br /&gt;
| 703 || file_mimetype   || String  || MIME type of the document. The client converts known types to more readable names before displaying them.&lt;br /&gt;
|-&lt;br /&gt;
| 704 || file_size       || Number  || Size of the document in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 705 || version         || Number  || Version number of the document. New documents start at 1. Every update increments the version by 1.&lt;br /&gt;
|-&lt;br /&gt;
| 706 || description     || String  || Description&lt;br /&gt;
|-&lt;br /&gt;
| 707 || locked_until    || Time    || The time until which this item will presumably be locked. Only set if the docment is currently locked, 0 otherwise.&lt;br /&gt;
|-&lt;br /&gt;
| 708 || file_md5sum     || String  || MD5Sum of the document. Not yet implemented, so this is currently always empty.&lt;br /&gt;
|-&lt;br /&gt;
| 709 || version_comment || String  || A version comment is used to file a changelog for the file.&lt;br /&gt;
|-&lt;br /&gt;
| 710 || current_version || Boolean || “true” if this version is the current version “false” otherwise. Note: This is not writeable&lt;br /&gt;
|-&lt;br /&gt;
| 711 || number_of_versions || Number || The number of all versions of the infoitem. Note: This is not writeable.&lt;br /&gt;
|-&lt;br /&gt;
| 7010 || com.openexchange.share.extendedObjectPermissions || Array || Each element is an object described in [[#ExtendedObjectPermissionObject | Extended object permission object]]. Read Only, Since 7.8.0.&lt;br /&gt;
|-&lt;br /&gt;
| 7020 || com.openexchange.realtime.resourceID || String || The resource identifier for the infoitem for usage within the realtime component. Read Only, Since 7.8.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || User ID of the user or group to which this permission applies.&lt;br /&gt;
|-&lt;br /&gt;
| group  || Boolean || true if entity refers to a group, false if it refers to a user.&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || The recipient type, i.e. one of &amp;quot;user&amp;quot;, &amp;quot;group&amp;quot;, &amp;quot;guest&amp;quot;, &amp;quot;anonymous&amp;quot; (required if no internal &amp;quot;entity&amp;quot; defined).&lt;br /&gt;
|-&lt;br /&gt;
| password  || String || An additional secret / pin number an anonymous user needs to enter when accessing the share (for type &amp;quot;anonymous&amp;quot;, optional) .&lt;br /&gt;
|-&lt;br /&gt;
| email_address  || String || The e-mail address of the recipient (for type &amp;quot;guest&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || The display name of the recipient (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_id  || String || The object identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, optional).&lt;br /&gt;
|-&lt;br /&gt;
| contact_folder  || String || The folder identifier of the corresponding contact entry if the recipient was chosen from the address book (for type &amp;quot;guest&amp;quot;, required if &amp;quot;contact_id&amp;quot; is set).&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date  || Time || The end date / expiration time after which the share link is no longer accessible (for type &amp;quot;anonymous&amp;quot;, optional).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ExtendedObjectPermissionObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Extended object permission object&lt;br /&gt;
! Name   !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| entity || Number  || Identifier of the permission entity (i.e. user-, group- or guest-ID).&lt;br /&gt;
|-&lt;br /&gt;
| bits   || Number  || A number as described in [[#ObjectPermissionFlags | Object Permission flags]].&lt;br /&gt;
|-&lt;br /&gt;
| type  || String || &amp;quot;user&amp;quot; for an internal user, &amp;quot;group&amp;quot; for a group, &amp;quot;guest&amp;quot; for a guest, or &amp;quot;anonymous&amp;quot; for an anonymous permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| display_name  || String || A display name for the permission entity.&lt;br /&gt;
|-&lt;br /&gt;
| contact  || Object || A (reduced) set of [[#DetailedContactData | Detailed contact data]] for &amp;quot;user&amp;quot; and &amp;quot;guest&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| share_url  || String || The share link for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || The optionally set password for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Date || The optionally set expiry date for &amp;quot;anonymous&amp;quot; entities.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ObjectPermissionFlags&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Object Permission flags&lt;br /&gt;
! Bits  !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || The numerical value indicating no object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || The numerical value indicating read object permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || The numerical value indicating write object permissions. This implicitly includes the “read” permission (this is no bitmask).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array with object IDs of requested infoitems.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get updated infoitems ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new, modified and deleted infoitems. New and modified infoitems are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted infoitems (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain strings, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested infoitem. The fields of the object are listed in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included.&lt;br /&gt;
&lt;br /&gt;
=== Search infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields as per tables [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; (optional) – The start index (inclusive) in the ordered search, that is requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; (optional) – The last index (inclusive) from the ordered search, that is requested.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchContacts | Search contacts]].&lt;br /&gt;
&lt;br /&gt;
=== Get an infoitem document ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (optional) – If present the infoitem data describes the given version. Otherwise the current version is returned &lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt;(optional) – If present the response declares the given content_type in the Content-Type header.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem or the content_type given.&lt;br /&gt;
&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
=== Get a ZIP archive containing the infoitems of a denoted folder (available with v7.6.1) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore/[filename]?action=zipfolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the infoitem's folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;recursive&amp;lt;/code&amp;gt; – &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to also include subfolders and their infoitems respectively; otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to only consider the infoitems of specified folder&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the ZIP archive. The response type for the HTTP Request is set to &amp;lt;code&amp;gt;application/zip&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Get all versions ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=versions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem whose versions are requested.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. The timestamp is the timestamp relating to the requested infostore item.&lt;br /&gt;
&lt;br /&gt;
=== Check if file name is valid (since 7.8.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=checkname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – Name of the file to check.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
=== Get multiple documents as a ZIP archive (available with v7.4.0) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=zipdocuments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; – A URL-encoded JSON array; see below for details&lt;br /&gt;
&lt;br /&gt;
Parameter &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;: A JSON array of JSON object tuples specifying the documents' versions to include in the requested ZIP archive; e.g&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[{&amp;quot;id&amp;quot;:&amp;quot;61820&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;61821&amp;quot;,&amp;quot;folder&amp;quot;:&amp;quot;70303&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;}]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The field &amp;lt;code&amp;gt;&amp;quot;version&amp;quot;&amp;lt;/code&amp;gt; is optional; if missing it refers to latest/current version.&amp;lt;br&amp;gt;&lt;br /&gt;
So, a valid parameter would look like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;body=%5B%7B%22id%22%3A%2261820%22%2C%22folder%22%3A%2270303%22%7D%2C%7B%22id%22%3A%2261821%22%2C%22folder%22%3A%2270303%22%2C%22version%22%3A%221%22%7D%5D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The download offer for the requested ZIP archive containing specified document versions&lt;br /&gt;
&lt;br /&gt;
=== Move one or more infoitems via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=move&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ID of the destination folder.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array consisting of JSON objects each referencing to an existing infoitem that is supposed to be moved to the destination folder&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36639&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;},&lt;br /&gt;
  {&amp;quot;id&amp;quot;:&amp;quot;31841/36641&amp;quot;, &amp;quot;folder&amp;quot;:&amp;quot;31841&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array consisting of those identifiers that could not be moved (due to a conflict) or an empty JSON array if everything went fine&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; – Optionally sets the start offset in bytes where to append the data to the document, must be equal to the actual document's length (available with v7.8.1).&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Create an infoitem via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. Sending out notifications for changed object permissions is possible, see the according PUT action for details on the request object.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem. The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
=== Save an attachment in the infostore ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=saveAs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object with the attachment&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object with the attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;Attachment&amp;lt;/code&amp;gt; – The id of the attachement to save.&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. The field id is not included. The fields in this infoitem object override values from the attachment. The folder_id must be given. It is possible to let added object permission entities be notified about newly shared files. In that case you need to provide the file data as an object &amp;quot;file&amp;quot; and add a &amp;quot;notification&amp;quot; object beside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;file&amp;quot;:{&lt;br /&gt;
    &amp;quot;object_permissions&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;bits&amp;quot;:403710016,&lt;br /&gt;
        &amp;quot;entity&amp;quot;:84,&lt;br /&gt;
        &amp;quot;group&amp;quot;:false&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;guest&amp;quot;,&lt;br /&gt;
        &amp;quot;email_address&amp;quot;:&amp;quot;john.doe@example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;:&amp;quot;John Doe&amp;quot;,&lt;br /&gt;
        &amp;quot;bits&amp;quot;:1&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;notification&amp;quot;:{&lt;br /&gt;
    &amp;quot;transport&amp;quot;:&amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;:&amp;quot;Hi!\nHave a look at this!&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Object ID of the newly created infoitem.&lt;br /&gt;
&lt;br /&gt;
=== Delete infoitems ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the deleted infoitems.&lt;br /&gt;
* &amp;lt;code&amp;gt;hardDelete&amp;lt;/code&amp;gt; - Optional, defaults to \&amp;quot;false\&amp;quot;. If set to \&amp;quot;true\&amp;quot;, the file is deleted permanently. Otherwise, and if the underlying storage supports a trash folder and the file is not yet located below the trash folder, it is moved to the trash folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with objects to delete. The fields for the object are described in [[#FullIdentifierForAnInfostoreDocument|Full identifier for an infostore document]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with [[]]. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FullIdentifierForAnInfostoreDocument&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Full identifier for an infostore document&lt;br /&gt;
! Name !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id   || Number || Object ID&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || Folder ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: A List of arrays with the version numbers of the infoitems to detach.&lt;br /&gt;
&lt;br /&gt;
Response: An array with version numbers that were not deleted.&lt;br /&gt;
&lt;br /&gt;
Note: When the current version of a document is deleted the new current version will be the newest version.&lt;br /&gt;
&lt;br /&gt;
=== Delete all versions of infostore documents ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=revert&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Removes all versions of the infostore document leaving only the base object.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via PUT ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; - Timestamp of the infostore object&lt;br /&gt;
&lt;br /&gt;
Request body: Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
Response: The id of the newly created object&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Copy an infostore document via POST ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/infostore?action=copy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated infoitem.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated infoitem. If the infoitem was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; - Infoitem object as described in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]]. Only modified fields are present.&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; – File Metadata as per &amp;lt;input type=”file” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request Body: Body of content-type “multipart/form-data” or “multipart/mixed” containing the above mentioned fields and file-data.&lt;br /&gt;
&lt;br /&gt;
Response: The response is sent as a HTML document (see introduction).&lt;br /&gt;
&lt;br /&gt;
Note: Only the fields (and the file) of the current document will be copied. Those fields present in the request are modified accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Lock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=lock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be locked.&lt;br /&gt;
* &amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt; (optional) – If present the value is added to the current time on the server (both in ms). The document will be locked until that time. If this parameter is not present, the document will be locked for a duration as configured on the server.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only include errors.&lt;br /&gt;
&lt;br /&gt;
=== Unlock an infoitem ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=unlock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the infoitem that should be unlocked.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Can only contain errors.&lt;br /&gt;
&lt;br /&gt;
=== Get shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/infostore?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for infoitems are defined in [[#CommonObjectData | Common object data]] and [[#DetailedInfoitemData | Detailed infoitem data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with infoitem data. Each array element describes one infoitem and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Notify about shared infoitems (Since 7.8.0, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/infostore?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the shared infoitem to notify about.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the JSON array &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;, which holds the entity ID(s) of the users or groups that should be notified. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;Attachments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Attachment Module allows file attachments to arbitrary objects. An Attachment always belongs to an object (called 'attached') in a certain folder of a certain module.  &lt;br /&gt;
&lt;br /&gt;
=== Get All Attachments for an Object ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachment's are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a list of attachments ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The Object ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder ID of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The Module type of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array of with object IDs of requested tasks.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with attachment data. Each array element describes one attachment and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Create an Attachment ===&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/attachment?action=attach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;json_[index]&amp;lt;/code&amp;gt; – The JSON representation of an attachment object as described in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;file_[index]&amp;lt;/code&amp;gt; – The file metadata as per &amp;lt;input type=file /&amp;gt; upload.&lt;br /&gt;
&lt;br /&gt;
Note: The JSON Object and file fields describe the corresponding attachment. For ex.: json_0 contains metadata for file_0, json_1 for file_1 and so on. Indexes start with 0.&lt;br /&gt;
&lt;br /&gt;
Request body: multipart/form-data or multipart/mixed containing the file data of the attached file and the above fields.&lt;br /&gt;
&lt;br /&gt;
Response: HTML page with javascript callback as per introduction. Contains a JSON-Array of ids of the newly created attachments. The order of the ids corresponds to the indexes in the request.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AttachmentObject&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Attachment Object&lt;br /&gt;
! ID  !! Name          !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 800 || folder        || Number  || The ID of the first Folder in which the attached object resides.&lt;br /&gt;
|-&lt;br /&gt;
| 801 || attached      || Number  || The object id of the object this attachement is attached to.&lt;br /&gt;
|-&lt;br /&gt;
| 802 || module        || Number  || The Module of this Object Possible Values:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1   || Appointment&lt;br /&gt;
|-&lt;br /&gt;
| 4   || Task&lt;br /&gt;
|-&lt;br /&gt;
| 7   || Contact&lt;br /&gt;
|-&lt;br /&gt;
| 137 || Infostore&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 803 || filename      || String  || The filename of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 804 || file_size     || Number  || The file size (in bytes) of the attached file.&lt;br /&gt;
|-&lt;br /&gt;
| 805 || file_mimetype || String  || The MIME-Type of the attached file&lt;br /&gt;
|-&lt;br /&gt;
| 806 || rft_flag      || Boolean || If the attachment is a RTF Attachment of Outlook. (Outlook descriptions can be stored as RTF Documents).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete Attachment ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/attachment?action=detach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – The ID of the base Object&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The type of the Object&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The Folder of the Object&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ids of the attachments to delete.&lt;br /&gt;
&lt;br /&gt;
=== Get updated attachments ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment?action=updates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for attachments are defined in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the last update of the requested infoitems.&lt;br /&gt;
ignore (optional) – Which kinds of updates should be ignored. Currently, the only valid value – &amp;quot;deleted&amp;quot; – causes deleted object IDs not to be returned.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with new and deleted attachments for the specified object. New attachments are represented by arrays. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter. Deleted attachments (should the &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt; parameter be ever implemented) would be identified by their object IDs as plain numbers, without being part of a nested array.&lt;br /&gt;
&lt;br /&gt;
=== Get an attachment ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attahment?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested attachment. The fields of the object are listed in [[#CommonObjectData | Common object data]] (with only id, created_by and creation_date available) and [[#AttachmentObject | Attachment object]]. &lt;br /&gt;
&lt;br /&gt;
=== Get an attachments filedata ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/attachment/[filename]?action=document&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – Object ID of the folder, whose contents are queried.&lt;br /&gt;
* &amp;lt;code&amp;gt;attached&amp;lt;/code&amp;gt; – Object ID of the object to which the attachments are attached.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – Module ID (as per [[#AttachmentObject | Attachment object]]) of the attached object.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested attachment.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_type&amp;lt;/code&amp;gt; (optional) – If set the responses Content-Type header is set to this value, not the attachements file mime type.&lt;br /&gt;
&lt;br /&gt;
Response body: The raw byte data of the document. The response type for the HTTP Request is set accordingly to the defined mimetype for this infoitem.&lt;br /&gt;
Note: The Filename may be added to the customary infostore path to suggest a filename to a Save-As dialog.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;reminder&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The reminder module provides the ability to fetch all active reminders for a user between two dates.&lt;br /&gt;
&lt;br /&gt;
=== Get reminder range ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/reminder?action=range&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; – The End date of the reminder range&lt;br /&gt;
&lt;br /&gt;
Response: An Array with all reminders which are scheduled until the specified time. Each reminder is described in [[#ReminderResponse | Reminder response]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ReminderResponse&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Reminder response&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The ID of the reminder.&lt;br /&gt;
|-&lt;br /&gt;
| target_id || Number || The target_id where this reminder is attached to&lt;br /&gt;
|-&lt;br /&gt;
| alarm     || Time   || The time of the alarm&lt;br /&gt;
|-&lt;br /&gt;
| module    || Number || The module of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| servertime || Time || The time on the server&lt;br /&gt;
|-&lt;br /&gt;
| user_id || Number || The ID of the user.&lt;br /&gt;
|-&lt;br /&gt;
| last_modified || Time || The last modification timestamp of the reminder&lt;br /&gt;
|-&lt;br /&gt;
| recurrence_position || Number || The recurrence position for series appointments or 0 if no series&lt;br /&gt;
|-&lt;br /&gt;
| folder || Number || The ID of the folder through that the object can be read&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Delete a Reminder===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An object with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the id that was not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Delete Reminders (since v6.22)===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of objects with the field “id”.&lt;br /&gt;
&lt;br /&gt;
Response body: An JSON array with the ids that were not deleted.&lt;br /&gt;
&lt;br /&gt;
=== Remind again (since v6.18.1) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/reminder?action=remindAgain&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the reminder whose date shall be changed.&lt;br /&gt;
&lt;br /&gt;
Request body: The JSON representation of the reminder; mainly containing the field “alarm” which provides the new reminder date.&amp;lt;br&amp;gt;&lt;br /&gt;
E.g. &amp;lt;code&amp;gt;{ &amp;quot;alarm&amp;quot;: 1283418027381 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response body: The JSON representation of the updated reminder.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;multiple&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The multiple module allows to bundle multiple requests to most other modules in a single request. Not supported are:&lt;br /&gt;
* modules login and multiple,&lt;br /&gt;
* POST requests with a multipart encoding (uploads),&lt;br /&gt;
* GET requests which do not use an object as described in [[#ResponseBody | Response body]] as response body (downloads).&lt;br /&gt;
&lt;br /&gt;
=== Multiple requests ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/multiple&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;continue&amp;lt;/code&amp;gt; – Specifies whether processing of requests should stop when an error occurs, or whether all request should be processed regardless of errors.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with request objects. Each request object contains all URI parameters of the &amp;quot;normal&amp;quot; request as fields. The module name of the &amp;quot;normal&amp;quot; request is included in the field module. The parameter session is not included. If the &amp;quot;normal&amp;quot; request has a request body, the object which is represented by that request body is includes as the value of the field data.&lt;br /&gt;
&lt;br /&gt;
Response: An array with reply objects as described in [[#ResponseBody | Response body]]. The order of reply objects corresponds to the order of requests in the request body. Unlike with all other modules, this response is itself not part of a response object as described in [[#ResponseBody | Response body]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;quota&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The filestore module allows accesssing information about the use and quota of the filestore.&lt;br /&gt;
&lt;br /&gt;
=== Get quota information (Since 7.6.1, Preliminary) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; (optional) – The module identifier to get quota information for, required if &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; is set.&lt;br /&gt;
* &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; (optional) – The account identifier within the module to get quota information for.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object containing the requested quota information. If no &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was specified, all defined [[#ModuleQuota | module quotas]] are set in the JSON object, each one mapped to it's module identifier. If the quota from a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; was requested, a JSON array containing all [[#AccountQuota | account quotas]] of this module are returned. If both a &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; were requested, a JSON object representing this specific [[#AccountQuota | account auota]] is returned. &lt;br /&gt;
&lt;br /&gt;
Note: In case there is no quota limitation defined for a module or account, no corresponding JSON object is included in the response. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ModuleQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Module Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || The display name of the module&lt;br /&gt;
|-&lt;br /&gt;
| accounts|| Array || Each element identifies an account quota within the module, as described in [[#AccountQuota | Account Quota]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;AccountQuota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Account Quota&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| account_id || String || Identifier of the account&lt;br /&gt;
|-&lt;br /&gt;
| account_name || String || Name of the account&lt;br /&gt;
|-&lt;br /&gt;
| countquota || Number || The account's quota limit for the number of items, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| countuse || Number || The account's actual usage for the number of items, or not set if no count quota defined&lt;br /&gt;
|-&lt;br /&gt;
| quota || Number || The account's quota limit for the storage in bytes, or not set if not defined&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The account's actual usage for the storage in bytes, or not set if no storage quota defined&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get the filestore usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=filestore&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the uploaded files sizes sum and the field “quota” represents the maximum.&lt;br /&gt;
&lt;br /&gt;
=== Get the mail usage data ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/quota?action=mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the fields “use” and “quota”. “use” represents the use mail quota and the field “quota” represents the maximum. -1 represents an unlimited quota.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;import&amp;quot;==&lt;br /&gt;
The module import allows to import specific module data (like Contacts, Tasks or Appointments) in several formats (iCal, vCard, CSV) into a folder. Please note: The callback for all actions of this bundle is callback_import, not callback_$actionname for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
=== Import CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: A &amp;quot;multipart/form-data&amp;quot; encoded .CSV file. The field name for the file is &amp;quot;file&amp;quot;. The column titles of the table are those used within the OX, see column ''Displayed Name'' in [[#DetailedContactData]].&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import Outlook CSV ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=OUTLOOK_CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; (preliminary, since 7.6.2) – Optional. A fixed character encoding to use when parsing the uploaded file, overriding the built-in defaults, following the conventions documented in RFC 2278.&lt;br /&gt;
&lt;br /&gt;
Request body: An .CSV file with Windows' default encoding Windows-1252. The column titles of the table may be those used by the English, French or German version of Outlook.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
=== Import iCAL ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This may be an Appointment or a Task folder. May even be a list containing both.&lt;br /&gt;
* &amp;lt;code&amp;gt;suppressNotification&amp;lt;/code&amp;gt; – This optional parameter can be used to disable the notifications for new appointments that are imported through the given iCal file. This help keeping the Inbox clean if a lot of appointments need to be imported. The value of this parameter does not matter because only for the existence of the parameter is checked.&lt;br /&gt;
* &amp;lt;code&amp;gt;ignoreUIDs&amp;lt;/code&amp;gt; – Optional. When set to &amp;quot;true&amp;quot;, UIDs are partially ignored during import of tasks and appointments from iCal. Internally, each UID is replaced statically by a random one to preserve possibly existing relations between recurring appointments in the same iCal file, but at the same time to avoid collisions with already existing tasks and appointments.&lt;br /&gt;
&lt;br /&gt;
Request body: An iCalendar file.&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered, and warnings (under the key &amp;quot;warnings&amp;quot;) containing an Array of objects with the warning data, containing all customary error fields.&lt;br /&gt;
&lt;br /&gt;
=== Import vCard ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/import?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder into which data should be imported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Request body: An vCard file, maybe of the formats: vCard 2.1, vCard 3.0 or vCalendar 1.0&lt;br /&gt;
&lt;br /&gt;
Response: An array of JSON-Objects, one for each entry in the list, containing: The Object ID of the entry, the Object ID of the folder the data was written into, a timestamp of the modification (in case of error, of modification attempt) and an error in case the data could not be entered.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;export&amp;quot; ==&lt;br /&gt;
The module export allows to export specific module data (like Contacts, Tasks or Appointments) from a folder in several formats (iCal, vCard, CSV).&lt;br /&gt;
&lt;br /&gt;
=== Exporting CSV ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=CSV&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – (optional) Columns to be imported from the given file, given as an array of column numbers. See [[#DetailedContactData | Detailed contact data]] for numbers.&lt;br /&gt;
* &amp;lt;code&amp;gt;export_dlists&amp;lt;/code&amp;gt; – (optional) toggles whether distribution lists are exported, too. Default is false. Option exists since 7.4.1.&lt;br /&gt;
Response: An InputStream containing the file of the MIME type &amp;lt;code&amp;gt;text/csv&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting iCAL ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=ICAL&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Calendar folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/calendar&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exporting vCard ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/export?action=VCARD&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – ObjectID of the folder whose contents are to be exported. This must be a Contact folder.&lt;br /&gt;
&lt;br /&gt;
Response: An InputStream containing the file, of the MIME type &amp;lt;code&amp;gt;text/x-vcard&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;sync&amp;quot; ==&lt;br /&gt;
The module sync delivers several core API extensions to support common operations used in a mobile synchronization environment.&lt;br /&gt;
&lt;br /&gt;
=== Clearing a folder's content ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/sync?action=refresh_server&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array containing the folder ID(s) whose content should be cleared. '''NOTE:''' Although the requests offers to clear multiple folders at once it is recommended to clear only one folder per request since if any exception occurs&lt;br /&gt;
(e.g. missing permissions) the complete request is going to be aborted.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of folders that could not be cleared due to a concurrent modification. Meaning you receive an empty JSON array if everything worked well.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;token&amp;quot; (since 7.4.0) ==&lt;br /&gt;
The module token delivers several core API extensions to support token based logins.&lt;br /&gt;
&lt;br /&gt;
=== Get a login token ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/token?action=acquireToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON object with the timestamp of the creation date and a token which can be used to create a new session.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mailfilter&amp;quot; ==&lt;br /&gt;
The module mailfilter describes how to add, update or delete mail filter rules or to check which actions are supported by the underlying system.&lt;br /&gt;
&lt;br /&gt;
A detailed description can be found here [[ HTTP_API_MailFilter | Mail Filter HTTP API]]&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;ajax file upload&amp;quot; ==&lt;br /&gt;
This module offers to store files in server's dedicated download directory for a configureable amount of time. The files are then accessible for further operations like inline images in (html) mails&lt;br /&gt;
&lt;br /&gt;
=== Uploading a file ===&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/file?action=new&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; – The module for which the file is uploaded to determine proper upload quota constraints (e.g. &amp;quot;mail&amp;quot;, &amp;quot;infostore&amp;quot;, etc.).&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; – The file type filter to define which file types are allowed during upload. Currently supported filters are: &amp;lt;code&amp;gt;file=all, text=text/*, media=image OR audio OR video, image=image/*, audio=audio/*, video=video/*, application=application/*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A common POST request body of MIME type &amp;quot;multipart/*&amp;quot; which holds the file(s) to upload&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing the IDs of the uploaded files. The files are accessible through the returned IDs for future use.&lt;br /&gt;
&lt;br /&gt;
=== Updating a file's last access timestamp (keep alive) ===&lt;br /&gt;
By updating the last access timestamp it's prevented from being deleted from both session and disk storage.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=keepalive&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file whose timestamp should be updated&lt;br /&gt;
&lt;br /&gt;
Response: The string &amp;quot;null&amp;quot; in response's data element&lt;br /&gt;
&lt;br /&gt;
=== Requesting a formerly uploaded file ===&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/file?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the uploaded file&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested file is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;image&amp;quot; ==&lt;br /&gt;
This module allows to download images from Open-Xchange server without providing a session ID in request's URL parameters.&lt;br /&gt;
&lt;br /&gt;
=== Requesting an image ===&lt;br /&gt;
Open-Xchange Server supports multiple image sources that are identified through request's path identifier&lt;br /&gt;
&lt;br /&gt;
* Inline images from mails&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mail/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Contact profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/contact/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* User profile image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/user/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* MP3 cover image&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/file/mp3cover&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Fetch a previously uploaded image using &amp;lt;code&amp;gt;&amp;quot;/ajax/file&amp;quot;&amp;lt;/code&amp;gt; interface&lt;br /&gt;
** Request path needs to be &amp;lt;code&amp;gt;&amp;quot;/mfile/picture&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each image source requires an individual set of required parameters&lt;br /&gt;
&lt;br /&gt;
==== Inline images from mails ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/mail/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;accountId&amp;lt;/code&amp;gt; – The mail account identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the mail resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The mail identifier&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the image inside the referenced mail&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Contact profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/contact/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; – The identifier of the folder in which the contact resides&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The contact identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== User profile images ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/user/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The user identifier&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MP3 cover image ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/file/mp3cover&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Managed Image File ====&lt;br /&gt;
GET &amp;lt;code&amp;gt;/image/mfile/picture&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; – The identifier of the uploaded image&lt;br /&gt;
&lt;br /&gt;
Response: The content of the requested image is directly written into output stream&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;conversion&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
A generic module to request data from a data source and to process obtained/submitted data with a data handler. Thus data is converted from a data source by a data handler.&lt;br /&gt;
&lt;br /&gt;
=== Converting data ===&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
or&amp;lt;br&amp;gt;&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/conversion?action=convert&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Parameters: &amp;amp;lt;no parameters required&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request body: A [[#ConversionRequest | conversion request]] JSON object containing nested JSON objects for [[#DataSource | data source]] and [[#DataHandler | data handler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ConversionRequest&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Conversion request object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| datasource || JSON object || The data source object.&lt;br /&gt;
|-&lt;br /&gt;
| datahandler || JSON object || The data handler object.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataSource&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data source object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data source.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data source&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DataHandler&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Data handler object&lt;br /&gt;
! Field      !! Type    !! Description&lt;br /&gt;
|-&lt;br /&gt;
| identifier || String || The identifier of the data handler.&lt;br /&gt;
|-&lt;br /&gt;
| args || JSON array or JSON object || The '''optional''' name-value-pairs as a single JSON object or  a JSON object for each kept inside a JSON array for data handler&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: The result of converted data ready as an appropriate JSON response&lt;br /&gt;
&lt;br /&gt;
==== Saving an ICal email attachment ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can be saved as appointments and tasks into given calendar and task folder.&lt;br /&gt;
If the fields &amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;quot; and &amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;quot; are set, the data handler inserts the appointment with the given status for the user, if the appointment does not exist. If it is already existing, the handler just updates the participant status.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;calendar-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.task.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;task-folder-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmstatus&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;status&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.confirmmessage&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;message&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added appointment/task; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Converting an ICal email attachment into JSON objects ====&lt;br /&gt;
&lt;br /&gt;
If an ICal file is attached to an email, its content can converted to JSON appointments and tasks.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.ical&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Note''' that all arguments are optional: Default is user time zone and zero recurrence position&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;com.openexchange.groupware.calendar.searchobject&amp;quot; triggers a search for the uid, and replaces the object_id and folder_id with the data of the corresponding ox-object id, if existing. The returned objects are still the ical objects and NOT the ox-objects.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.ical.json&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.calendar.timezone&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;timezone-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.recurrencePosition&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;recurrence-position&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{&amp;amp;quot;com.openexchange.groupware.calendar.searchobject&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;true|false&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects for each appointment/task as described in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]]/[[##DetailedAppointmentData | Detailed appointment data]]&lt;br /&gt;
&lt;br /&gt;
==== Saving a VCard email attachment ====&lt;br /&gt;
&lt;br /&gt;
If a VCard file is attached to an email, its content can be saved as contacts into given contact folder.&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.fullname&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-fullname&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.mailid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;mail-id&amp;amp;gt;&amp;amp;quot;},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.mail.conversion.sequenceid&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;attachment-sequence-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;com.openexchange.groupware.contact.folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;contact-folder-id&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array of JSON objects each providing folder and object ID of added contact; e.g. &amp;lt;code&amp;gt;[{&amp;amp;quot;folder_id&amp;amp;quot;:2567, &amp;amp;quot;id&amp;amp;quot;:7689}, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contact(s) attached to a new email as a VCard file ====&lt;br /&gt;
&lt;br /&gt;
Obtain VCard data from specified contact object(s).&lt;br /&gt;
&lt;br /&gt;
Data source's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.contact&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-id1&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;id1&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{&amp;amp;quot;folder&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;folder-idn&amp;amp;gt;&amp;amp;quot;,&amp;amp;quot;id&amp;amp;quot;:&amp;amp;quot;&amp;amp;lt;idn&amp;amp;gt;&amp;amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Get a new email's JSON object with specified VCard data source attached.&lt;br /&gt;
&lt;br /&gt;
Data handler's JSON object&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;identifier&amp;amp;quot;:&amp;amp;quot;com.openexchange.mail.vcard&amp;amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;quot;args&amp;amp;quot;:[]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: A [[#DetailedMailData | mail]] JSON object.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:{search-term-object}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&amp;lt;br&amp;gt;&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[...]}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moreover there are two different types of a search terms:&lt;br /&gt;
* A single search term&lt;br /&gt;
* A composite search term&lt;br /&gt;
&lt;br /&gt;
A single search term reflects an operation which cannot hold nested search terms as operands; e.g. &amp;quot;equals&amp;quot;. In opposite to this a composite search term holds one or more nested search terms as operands; e.g. &amp;quot;not&amp;quot; or the logical junctors &amp;quot;and&amp;quot;/&amp;quot;or&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
By now the following operations are supported:&lt;br /&gt;
* composite operations&lt;br /&gt;
** &amp;quot;and&amp;quot; - The AND junctor&lt;br /&gt;
** &amp;quot;or&amp;quot; - The OR junctor&lt;br /&gt;
** &amp;quot;not&amp;quot; - Negation&lt;br /&gt;
* single operations&lt;br /&gt;
** &amp;quot;equals&amp;quot; - Equals comparison&lt;br /&gt;
** &amp;quot;lt&amp;quot; - Less-than comparison&lt;br /&gt;
** &amp;quot;gt&amp;quot; - Greater-than comparison&lt;br /&gt;
&lt;br /&gt;
Furthermore following operand types are supported for single search terms:&lt;br /&gt;
* Column - Providing a name referring to a field/column&lt;br /&gt;
* Constant - A constant&lt;br /&gt;
&lt;br /&gt;
Example of an EQUALS search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of an OR search term:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{&amp;quot;operation&amp;quot;:&amp;quot;or&amp;quot;,&amp;quot;operands&amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;[&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;equals&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;first_name&amp;quot;},&amp;quot;Jane&amp;quot;]},&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;{&amp;quot;operation&amp;quot;:&amp;quot;gt&amp;quot;,&amp;quot;operands&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;column&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;birthday&amp;quot;},&amp;quot;1975-05-01&amp;quot;]}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;]&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Refer to object data tables introduced by different modules to know which field names are supported; e.g. for tasks it is [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]], and [[#DetailedTaskData | Detailed task data]].&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;search&amp;quot; (alternative suggestion, still preliminary) ==&lt;br /&gt;
&lt;br /&gt;
The search module is an enhancement to each search request as an optional JSON object via PUT method to filter elements; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
PUT /ajax/contacts?action=all&amp;amp;...&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;filter&amp;quot;:&amp;lt;i&amp;gt;[search term]&amp;lt;/i&amp;gt;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This section describes the syntax of the optional JSON object representing the search term.&lt;br /&gt;
In general the structure of a search term is in prefix notation; meaning the operator is written before its operands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[&amp;quot;&amp;gt;&amp;quot;, 5, 2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The available operators are:&lt;br /&gt;
* Comparison operators &amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;=&amp;quot;, &amp;quot;&amp;lt;=&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
* logic operators &amp;quot;not&amp;quot;, &amp;quot;and&amp;quot;, &amp;quot;or&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Comparison operators have exactly two operands. Each operand can be either a field name or a constant. A field name is an object with the member &amp;quot;field&amp;quot; specifying the field name, e.g. &amp;lt;code&amp;gt;{ field: &amp;quot;first_name&amp;quot; }&amp;lt;/code&amp;gt;. The available field names depend on the searched module. Primitive JSON types are interpreted as constants. Arrays are not valid operands for comparison operators.&lt;br /&gt;
&lt;br /&gt;
The logic operator &amp;quot;not&amp;quot; has exactly one operand, the other logic operators can have any number of operands. Each operand must be an array representing a nested search expression.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;mail account&amp;quot; (available with v6.12) ==&lt;br /&gt;
&lt;br /&gt;
The mail account module is used to manage multiple mail accounts held by a user.&lt;br /&gt;
&lt;br /&gt;
=== Get All mail accounts  ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mail account's are defined in [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: An array with attachment data. Each array element describes one mail account and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a mail account ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/account?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The ID of the account to return.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the desired mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MailAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Mail account data&lt;br /&gt;
! ID    !! Name          !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
|  1001   || id            || Number  || Account ID&lt;br /&gt;
|-&lt;br /&gt;
|  1002   ||  login    || String  || The login.&lt;br /&gt;
|-&lt;br /&gt;
|  1003   ||  password   || String  || The (optional) password.&lt;br /&gt;
|-&lt;br /&gt;
|  1004   ||  mail_url || String    || The mail server URL; e.g. &amp;quot;imap://imap.somewhere.com:143&amp;quot;. '''URL is preferred over single fields''' (like mail_server, mail_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|  1005   ||  transport_url || String    || The transport server URL; e.g. &amp;quot;smtp://smtp.somewhere.com:25&amp;quot;. '''URL is preferred over single fields''' (like transport_server, transport_port, etc.)&lt;br /&gt;
|-&lt;br /&gt;
|   1006  ||  name || String    || Account's display name.&lt;br /&gt;
|-&lt;br /&gt;
|  1007   ||  primary_address || String    || User's primary address in account; e.g. &amp;quot;someone@somewhere.com&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|  1008   ||  spam_handler || String    || The name of the spam handler used by account.&lt;br /&gt;
|-&lt;br /&gt;
|   1009  ||  trash || String    || The name of the default trash folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1010   ||  sent || String    || The name of the default sent folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1011  ||  drafts || String    || The name of the default drafts folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1012   ||  spam || String    || The name of the default spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|  1013   ||  confirmed_spam || String    || The name of the default confirmed-spam folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1014  || confirmed_ham || String    || The name of the default confirmed-ham folder.&lt;br /&gt;
|-&lt;br /&gt;
|   1015  ||  mail_server || String    || The mail server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1016  ||  mail_port || Number    || The mail server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1017  ||  mail_protocol || String    || The mail server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;imap&amp;quot; instead of &amp;quot;imaps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1018  ||  mail_secure || Boolean    || Whether to establish a secure connection to mail server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1019  ||  transport_server || String    || The transport server's hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
|   1020  ||  transport_port || Number    || The transport server's port.&lt;br /&gt;
|-&lt;br /&gt;
|   1021  ||  transport_protocol || String    || The transport server's protocol. '''Always use basic protocol name.''' E.g. use &amp;quot;smtp&amp;quot; instead of &amp;quot;smtps&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1022  ||  transport_secure || Boolean    || Whether to establish a secure connection to transport server (SSL, TLS).&lt;br /&gt;
|-&lt;br /&gt;
|   1023  ||  transport_login || String    || The transport login. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1024  ||  transport_password || String    || The transport password. '''Please see &amp;quot;transport_auth&amp;quot; for the handling of this field.'''&lt;br /&gt;
|-&lt;br /&gt;
|   1025  ||  unified_inbox_enabled || Boolean    || If enabled for Unified INBOX&lt;br /&gt;
|-&lt;br /&gt;
|   1026  ||  trash_fullname || String    || Path to default trash folder. Preferred over &amp;quot;trash&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1027  ||  sent_fullname || String    || Path to default sent folder. Preferred over &amp;quot;sent&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1028  ||  drafts_fullname || String    || Path to default drafts folder. Preferred over &amp;quot;drafts&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1029  ||  spam_fullname || String    || Path to default spam folder. Preferred over &amp;quot;spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1030  ||  confirmed_spam_fullname || String    || Path to default confirmed-spam folder. Preferred over &amp;quot;confirmed_spam&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1031  ||  confirmed_ham_fullname || String    || Path to default confirmed-ham folder. Preferred over &amp;quot;confirmed_ham&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1032  ||  pop3_refresh_rate || Number    || The interval in minutes the POP3 account is refreshed&lt;br /&gt;
|-&lt;br /&gt;
|   1033  ||  pop3_expunge_on_quit || Boolean    || Whether POP3 messages shall be deleted on actual POP3 account after retrieval or not&lt;br /&gt;
|-&lt;br /&gt;
|   1034  ||  pop3_delete_write_through || Boolean    || If option &amp;quot;pop3_expunge_on_quit&amp;quot; is disabled, this property defines whether a delete in local INBOX also deletes affected message in actual POP3 account&lt;br /&gt;
|-&lt;br /&gt;
|   1035  ||  pop3_storage || String    || The name of POP3 storage provider, default is &amp;quot;mailaccount&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|   1036  ||  pop3_path || String    || Path to POP3's virtual root folder in storage, default is name of the POP3 account beside default folders&lt;br /&gt;
|-&lt;br /&gt;
|   1037  ||  personal || String    || The customizable personal part of email address&lt;br /&gt;
|-&lt;br /&gt;
|   1038  ||  reply_to || String    || The customizable reply-to email address&lt;br /&gt;
|-&lt;br /&gt;
|   1039  ||  addresses || String    || The comma-separated list of available E-Mail addresses including aliases. !! Only available for primary mail account !!&lt;br /&gt;
|-&lt;br /&gt;
|   1040  ||  meta || JSON data    || Stores arbitrary JSON data as specified by client associated with the mail account&lt;br /&gt;
|-&lt;br /&gt;
|   1041  ||  archive || String    || The name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1042  ||  archive_fullname || String    || The full name of the archive folder. Currently not functional!&lt;br /&gt;
|-&lt;br /&gt;
|   1043  ||  transport_auth || String    || '''Available since v7.6.1''' Specifies the source for mail transport (SMTP) credentials. Possible values: &amp;quot;mail&amp;quot;, &amp;quot;custom&amp;quot;, and &amp;quot;none&amp;quot;.&amp;lt;br&amp;gt;- &amp;quot;mail&amp;quot; signals to use the same credentials as given in associated mail store (IMAP, POP3).&amp;lt;br&amp;gt;- &amp;quot;custom&amp;quot; signals that individual credentials are supposed to be used (fields &amp;quot;transport_login&amp;quot; and &amp;quot;transport_password&amp;quot; are considered).&amp;lt;br&amp;gt;- &amp;quot;none&amp;quot; means the mail transport does not support any authentication mechanism (rare case!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Create a new mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=new&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to create. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the inserted mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object identifiying (field ID is present) and describing the account to update. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object representing the updated mail account. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
=== Delete a mail account ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: An array with the ID of the mail account to delete.&lt;br /&gt;
&lt;br /&gt;
=== Validate a mail account (which shall be created) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/account?action=validate&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; - An optional boolean parameter which indicates whether on successful validation the folder tree shall be returned (NULL on failure) or if set to &amp;quot;false&amp;quot; or missing only a boolean is returned which indicates validation result&lt;br /&gt;
&lt;br /&gt;
Request: A JSON object describing the new account to validate. See [[#MailAccountData | mail account data]].&lt;br /&gt;
&lt;br /&gt;
Response: Dependent on optional &amp;quot;tree&amp;quot; parameter a JSON folder object or a boolean value indicating the validation result&lt;br /&gt;
&lt;br /&gt;
The JSON folder object corresponding to [[#CommonFolderData | Common folder data]] and [[#DetailedFolderData | Detailed folder data]].&lt;br /&gt;
Additionally a field &amp;quot;subfolder_array&amp;quot; is added which contains possible subfolders. This field is missing if a folder contains no subfolders.&lt;br /&gt;
&lt;br /&gt;
[[Category: OX6]]&lt;br /&gt;
&lt;br /&gt;
== Module Auto Configuration (since 6.22) ==&lt;br /&gt;
&lt;br /&gt;
=== Get Auto Configuration ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/autoconfig?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; – Email Adress for which a mail configuration will be discovered.&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; – Corresponding password for the mail account (optional)&lt;br /&gt;
&lt;br /&gt;
Response: A JSON Object containing the best available settings for an appropriate mail Server for the given email address. The fields are described in [[#MailAccountData | mail account data]]. The Data may be incomplete or even empty.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user&amp;quot; (available with v6.14) ==&lt;br /&gt;
&lt;br /&gt;
The user module is used to access user information.&lt;br /&gt;
&lt;br /&gt;
=== Get all users ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DetailedUserData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Detailed user data&lt;br /&gt;
! ID  !! Displayed name              !! Name                 !! Type       !! Value&lt;br /&gt;
|-&lt;br /&gt;
| 610 || Aliases                     || aliases              || Array      || The user's aliases&lt;br /&gt;
|-&lt;br /&gt;
| 611 || Time zone                   || timezone             || String     || The time zone ID.&lt;br /&gt;
|-&lt;br /&gt;
| 612 || Locale                      || locale               || String     || The name of user's entire locale, with the language, country and variant separated by underbars. E.g. &amp;quot;en&amp;quot;, &amp;quot;de_DE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 613 || Groups                      || groups               || Array      || The IDs of user's groups&lt;br /&gt;
|-&lt;br /&gt;
| 614 || Contact ID                  || contact_id           || Number     || The contact ID of the user&lt;br /&gt;
|-&lt;br /&gt;
| 615 || Login info                  || login_info           || String     || The user's login information&lt;br /&gt;
|-&lt;br /&gt;
| 616 || Guest Created By            || guest_created_by     || Number     || The ID of the user who has created this guest in case this user represents a guest user; it is 0 for regular users (preliminary, available with v7.8.0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get a list of users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for users are defined in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
Request body: An array of numbers. Each number is the ID of requested user. Since v6.18.1, a &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; value in the array is interpreted as the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get a user ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the requested user. Since v6.18.1, this parameter is optional: the default is the currently logged in user.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An object containing all data of the requested user. The fields of the object are listed in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]].&lt;br /&gt;
&lt;br /&gt;
=== Update a user ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – Object ID of the updated user.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – Timestamp of the updated user. If the user was modified after the specified timestamp, then the update must fail.&lt;br /&gt;
&lt;br /&gt;
Request body: User object as described in [[#CommonObjectData | Common object data]], [[#DetailedContactData | Detailed contact data]] and [[#DetailedUserData | Detailed user data]]. Only modified fields are present.&lt;br /&gt;
&lt;br /&gt;
'''Note''': &amp;quot;timezone&amp;quot; and &amp;quot;locale&amp;quot; are the only fields from [[#DetailedUserData | Detailed user data]] which are allowed to be updated.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty object.&lt;br /&gt;
&lt;br /&gt;
=== Search users ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=search&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – The requested fields&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified. In case of use of column 609 (use count depending order for collected users with global address book) the parameter &amp;quot;order&amp;quot; ist NOT necessary and will be ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request body: An Object as described in [[#SearchUsers | Search users]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsers&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| pattern || String || Search pattern to find users. In the pattern, the character &amp;quot;*&amp;quot; matches zero or more characters and the character &amp;quot;?&amp;quot; matches exactly one character. All other characters match only themselves.&lt;br /&gt;
|-&lt;br /&gt;
| startletter || String || Search users with the given startletter. If this field is present, the pattern is matched against the user field which is specified by the property contact_first_letter_field on the server (default: last name). Otherwise, the pattern is matched against the display name.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alternative request body: An Object as described in [[#SearchUsersAlternative | Search users alternative]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;SearchUsersAlternative&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Search users alternative&lt;br /&gt;
! Name    !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| last_name || String || Searches users where the last name match with the given last name.&lt;br /&gt;
|-&lt;br /&gt;
| first_name || String || Searches users where the first name match with the given first name.&lt;br /&gt;
|-&lt;br /&gt;
| display_name || String || Searches users where the display name match with the given display name.&lt;br /&gt;
|-&lt;br /&gt;
| orSearch || Boolean || If set to true, the fields are connected through an OR search habit.&lt;br /&gt;
|-&lt;br /&gt;
| emailAutoComplete || Boolean || If set to true, results are guaranteed to contain at least one email adress and the search is performed by connecting the relevant fields through an OR search habit.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response: An array with user data. Each array element describes one user and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user?action=getAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – The attribute name. &lt;br /&gt;
&lt;br /&gt;
Response without timestamp: A JSON object providing name and value of the requested attribute&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set user attribute (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/user?action=setAttribute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID of the user. &lt;br /&gt;
* &amp;lt;code&amp;gt;setIfAbsent&amp;lt;/code&amp;gt; - Set to &amp;quot;true&amp;quot; to put the value only if the specified name is not already associated with a value, otherwise &amp;quot;false&amp;quot; to put value in any case&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing name and value of the attribute. If the &amp;lt;code&amp;gt;&amp;quot;value&amp;quot;&amp;lt;/code&amp;gt; field id missing or NULL, the attribute is removed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 { &amp;quot;name&amp;quot;:&amp;quot;somename&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;somevalue&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if PUT was successful; otherwise &amp;quot;false&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;user/me&amp;quot; (available with v7.6.2) ==&lt;br /&gt;
&lt;br /&gt;
The user/me module is used to access formal information about current user.&lt;br /&gt;
&lt;br /&gt;
=== Get user information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/user/me&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: A JSON object providing information for current user&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;context_id&amp;quot;: 1234,&lt;br /&gt;
        &amp;quot;user_id&amp;quot;: 5,&lt;br /&gt;
        &amp;quot;is_context_admin&amp;quot;: false,&lt;br /&gt;
        &amp;quot;login_name&amp;quot;: &amp;quot;user5&amp;quot;,&lt;br /&gt;
        &amp;quot;display_name&amp;quot;: &amp;quot;User Five&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: 1400855683800&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;OAuth&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The Open-Xchange server can act as an OAuth client (starting with v6.20) or be an OAuth provider itself (starting with v7.8.0). The OAuth module supports both aspects:&lt;br /&gt;
&lt;br /&gt;
* Manage multiple OAuth accounts for certain online services for a user. The OAuth mechanism allows the Open-Xchange application to act as behalf of this user using previously obtained access tokens granted by user. The according interface is divided into two parts: Account access and service's meta data access.&lt;br /&gt;
* Manage granted accesses of external services that can access a users data on his behalf, called &amp;quot;grants&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== OAuth account access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service account access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth accounts ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The &amp;lt;b&amp;gt;optional&amp;lt;/b&amp;gt; service meta data identifier. If missing all accounts of all services are returned; otherwise all accounts of specified service are returned&lt;br /&gt;
&lt;br /&gt;
Response: An array with account data. Each array element is a JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthAccountData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
| serviceId     || String   || The identifier of the associated service meta data; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| secret || String || The token secret&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Delete an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=delete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Update an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The account identifier. May also be provided in request body's JSON OAuth account representation by &amp;lt;code&amp;gt;&amp;quot;id&amp;quot;&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object providing the OAuth account fields to update. See [[#OauthAccountData | OAuth account data]]. Currently the only values which make sende being updated are &amp;lt;code&amp;gt;&amp;quot;displayName&amp;quot;&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;&amp;quot;token&amp;quot;&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;&amp;quot;secret&amp;quot;&amp;lt;/code&amp;gt;-pair.&lt;br /&gt;
&lt;br /&gt;
Response: The boolean value &amp;quot;true&amp;quot; if successful&lt;br /&gt;
&lt;br /&gt;
==== Initialize creation of an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=init&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – The service meta data identifier; e.g. &amp;lt;code&amp;gt;&amp;quot;com.openexchange.oauth.twitter&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An JSON representation of the resulting interaction providing needed information to complete account creation. See [[#OauthInteractionData | OAuth interaction data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OauthInteractionData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth interaction&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| authUrl || String || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The interaction type name; &amp;lt;code&amp;gt;&amp;quot;outOfBand&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;callback&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| token    || String || The token&lt;br /&gt;
|-&lt;br /&gt;
| uuid || String || The UUID for this OAuth interaction&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Create an OAuth account ====&lt;br /&gt;
&lt;br /&gt;
Note: This action is typically called by provided call-back URL and is ony intended for manual invocation if &amp;quot;outOfBand&amp;quot; interaction is returned by preceeding &amp;lt;code&amp;gt;/ajax/oauth/account?action=init&amp;lt;/code&amp;gt; step.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/oauth/accounts?action=create&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_token&amp;lt;/code&amp;gt; – The request token from preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; – The UUID of the preceeding OAuth interaction&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_verfifier&amp;lt;/code&amp;gt; – The verifier string which confirms that user granted access&lt;br /&gt;
* &amp;lt;code&amp;gt;displayName&amp;lt;/code&amp;gt; – The display name for the new account&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing the newly created OAuth account as specified in [[#OAuthAccountData | OAuth account data]].&lt;br /&gt;
&lt;br /&gt;
=== OAuth service meta data access (available with v6.20) ===&lt;br /&gt;
&lt;br /&gt;
The OAuth service meta data access description.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Get all OAuth services' meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array with service data. Each array element is a JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
==== Get an OAuth service's meta data ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/services?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The service's identifier.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON object describing an OAuth service's meta data as specified in [[#OAuthServiceMetaData | OAuth service meta data]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthServiceMetaData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth service meta data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Number || The numeric identifier of the OAuth account.&lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || The account display name&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Manage OAuth grants (available with v7.8.0) ===&lt;br /&gt;
&lt;br /&gt;
==== Get all grants ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/oauth/grants?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: A JSON array containing one object for every granted access as specified in [[#OAuthGrants | OAuth grants]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthGrants&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth grants&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| client || Object || A JSON object describing the external service as in [[#OAuthClient | OAuth client]].&lt;br /&gt;
|-&lt;br /&gt;
| scopes || Object || A JSON object with mappings from scope tokens to translated, human-readable descriptions for every scope that was granted to the external service. Example: {&amp;quot;read_contacts&amp;quot;:&amp;quot;See all your contacts.&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| date || Time || The time when the access was granted.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;OAuthClient&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | OAuth client&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The clients ID.&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The clients/services name.&lt;br /&gt;
|-&lt;br /&gt;
| description || String || A description of the client.&lt;br /&gt;
|-&lt;br /&gt;
| website || String || A URL to the clients website.&lt;br /&gt;
|-&lt;br /&gt;
| icon || String || A URL or path to obtain the clients icon via the &amp;quot;image&amp;quot; module.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Revoke access ====&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;oauth/grants?action=revoke&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - The ID of the client whose access shall be revoked.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;JSlob&amp;quot; (available with v6.22) ==&lt;br /&gt;
&lt;br /&gt;
The JSlob module is used to store&amp;amp;retrieve arbitrary JSON-structured configuration for a single user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all JSLobs ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jslob?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;JSlobData&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | JSlob data&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || String or Number || The identifier of the JSlob.&lt;br /&gt;
|-&lt;br /&gt;
| jslob || JSON object || The JSON configuration.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== List denoted JSLobs ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON array of JSlob identifiers; e.g. &amp;lt;code&amp;gt;[ &amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, … ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: An array with JSON configurations. Each array element is a JSON object representing a certain configuration consisting if a &amp;quot;id&amp;quot; and &amp;quot;jslob&amp;quot; field. See [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== Delete a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The JSlob identifier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: An empty request body&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Store a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the &amp;quot;path&amp;quot; and &amp;quot;value&amp;quot; of the JSON configuration to store. If &amp;quot;path&amp;quot; is missing the current configuration&lt;br /&gt;
is merged with given JSON object.&lt;br /&gt;
&lt;br /&gt;
Response: Nothing&lt;br /&gt;
&lt;br /&gt;
=== Update a single value inside a JSlob ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/jslob?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;serviceId&amp;lt;/code&amp;gt; – Optional identifier for the JSlob service. Default is &amp;lt;code&amp;gt;com.openexchange.jslob.config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier for the new JSlob to create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Request body: The new value to store inside specified JSlob&lt;br /&gt;
&lt;br /&gt;
Response: A JSlob representation according to [[#JSlobData | JSlob data ]]&lt;br /&gt;
&lt;br /&gt;
=== REST-like access to JSlob module ===&lt;br /&gt;
&lt;br /&gt;
to be done...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;freebusy&amp;quot; (available with v6.22.1) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to free/busy information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get free/busy information ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/freebusy?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;participant&amp;lt;/code&amp;gt; – The participant to get the free/busy data for. May be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Response: An array of free/busy intervals as described in [[#FreeBusyInterval | Free/Busy interval]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FreeBusyInterval&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Free/Busy interval&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| start_date  || Time       || Start time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| end_date    || Time       || End time of the interval.&lt;br /&gt;
|-&lt;br /&gt;
| shown_as    || Number     || The busy status of this interval, one of:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| 1 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 1 || reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2 || temporary&lt;br /&gt;
|-&lt;br /&gt;
| 3 || absent&lt;br /&gt;
|-&lt;br /&gt;
| 4 || free&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| id          || String     || Object ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| folder_id   || String     || Folder ID of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| title       || String     || Title of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| location    || String     || Location of the corresponding appointment if available.&lt;br /&gt;
|-&lt;br /&gt;
| full_time   || Boolean    || True if the corresponding appointment is a whole day appointment, not present otherwise.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a list of free/busy information ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/freebusy?action=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; – The lower (inclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; – The upper (exclusive) limit of the requested time-range.&lt;br /&gt;
* &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt; (optional) – True or False. Whether to pre-process the free/busy data on the server or not. This includes sorting as well as merging overlapping free/busy intervals.&lt;br /&gt;
&lt;br /&gt;
Request body: An array of participants to get the free/busy data for. Each participant may be either an internal user-, group- or resource-ID, or an e-mail address for external participants.&lt;br /&gt;
&lt;br /&gt;
Response: The free/busy data for all requested participants inside a JSON object with the participants as keys. Besides a combined data element for a requested group, all group members are resolved and listed seperately in the result. If the 'merged' view was requested, an additional data element named 'merged' representing a combined view for all requested participants is added to the results implicitly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Services ==&lt;br /&gt;
&lt;br /&gt;
Messaging Services represent a messaging backend. The messaging services add a new folder module &amp;quot;messaging&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
A *Messaging Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a messagingService. Usually a String in reverse domain name notation. Example: &amp;quot;com.openexchange.messaging.twitter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Twitter&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| formDescription || Array      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
| messagingActions || Array     || An array of Strings a dynamic set of actions that are possible with messages of this service. Described in detail later on. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of messaging service objects. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/service?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the messaging service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a messaging service object.&lt;br /&gt;
&lt;br /&gt;
== Messaging Accounts ==&lt;br /&gt;
&lt;br /&gt;
A messaging account represents the concrete configuration of an account of a given messaging service.&lt;br /&gt;
A *messaging account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || Number      || Identifies a given messaging account. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| messagingService || String  || The messaging service id of the messaging service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant messagingService &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/account?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;messagingService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* messagingService - The messaging service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/account?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* messagingService - (optional) list only those accounts that belong to the given messagingService.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messaging Messages ==&lt;br /&gt;
&lt;br /&gt;
A Messaging Message represents a single message. It consists of some metadata, headers and a content. The content attribute varies by the content-type header. &lt;br /&gt;
If the content type is text/* it is a string, if it is a multipart/* it is an array of objects, each representing a part of the multipart. If it is anything else&lt;br /&gt;
it is considered binary and is a Base64 encoded string (ToDo : This is not smart enough yet. I suppose we'll have to include encoding options for binaries much like in our EAVJSONProposal).&lt;br /&gt;
&lt;br /&gt;
The folder id of a message follows a predefined format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[messagingService]://[accountId]/[path]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for an imaginary example consider: &amp;quot;com.openexchange.messaging.twitter://535/defaultTimeline/directMessages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The structure of a Messaging Message is as follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Messaging Message&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|id            ||String       || The id of this message. Only unique in the given folder. &lt;br /&gt;
|-&lt;br /&gt;
|folder        ||String       || The folder id. &lt;br /&gt;
|-&lt;br /&gt;
|threadLevel   ||Number       || The nesting level of this message according to the conversation it's belonged to. May not be set. &lt;br /&gt;
|-&lt;br /&gt;
|flags         ||Number       || Bitmask showing the state of this message. The same as in the module &amp;quot;mail&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|receivedDate  ||Time         || The time this message was received. &lt;br /&gt;
|-&lt;br /&gt;
|colorLabel    ||Number       || An arbitrary number marking this message in a certain color. The same as the colorLabel common to all groupware objects (see HTTP API)&lt;br /&gt;
|-&lt;br /&gt;
|user          ||Array        || An array of strings. Represents user flags. &lt;br /&gt;
|-&lt;br /&gt;
|size          ||Number       || The binary size of this message in bytes. &lt;br /&gt;
|-&lt;br /&gt;
|picture    || String       || A string depicting the URL to a picture for this message &lt;br /&gt;
|-&lt;br /&gt;
|url           || String      || A string that contains a link to the messages origin. Currently used in RSS messages.&lt;br /&gt;
|-&lt;br /&gt;
|headers       ||JSONObject   || A JSON Object of header data. Usually the value is either a String or an Array (if the headers has more than one value). Certain headers are rendered as more complex structures, see the section &amp;quot;Complex Headers&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|content       ||String or Array || See introductory note for Messaging Messages. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The structure of a Multipart Part (an element of the content array in a multipart/* message) is a s follows:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Multipart Element&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
|sectionId     || String       || The sectionId of this part.&lt;br /&gt;
|-&lt;br /&gt;
|headers       || JSONObject   || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|content       || String or Array || Same as above. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some *Complex Headers* have a structure differing from simple key/value(s) pairs. These are:&lt;br /&gt;
&lt;br /&gt;
=== Content-Type ===&lt;br /&gt;
&lt;br /&gt;
The Content-Type header is represented as a JSON Object with the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Content Type Header&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| type         || String          || The type string (eg. text/plain). This governs the rendering of the content of a message. &lt;br /&gt;
|-&lt;br /&gt;
| params       || Object          || An Object with the keys &amp;quot;charset&amp;quot;, containing the charset of this message and &amp;quot;name&amp;quot; pointing to the filename this part or message should have. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting the content-type header in a messaging messages generated on the client the header may also be sent in it's short form. The short form is the type followed by a semi-colon separated list of key=value pairs&lt;br /&gt;
of the params. For example: &amp;quot;text/plain;charset=utf-8;name=something.txt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Address Headers ===&lt;br /&gt;
&lt;br /&gt;
Address headers ( From, To,Cc,Bcc,Reply-To,Resent-Reply-To,Disposition-Notification-To,Resent-To,Sender,Resent-Sender,Resent-To,Resent-Cc,Resent-Bcc ) are formatted as an array of objects, or in case of &amp;quot;From&amp;quot; as a single object, with the attributes *address* and *personal*:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Address Headers&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| address         || String     || The technical part of the address&lt;br /&gt;
|-&lt;br /&gt;
| personal       || String      || A displayable description of the addressee. May be unset.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When setting an address header the header may also be sent by clients in the short form &amp;lt;code&amp;gt;&amp;quot;personal &amp;amp;lt;address&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;&amp;quot;Clark Kent &amp;amp;lt;clark.kent@dailyplanet.com&amp;amp;gt;&amp;quot;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== List renderings of Messaging Messages ===&lt;br /&gt;
&lt;br /&gt;
Actions returning lists of messages usually return only a selection of attributes of a message driven by a &amp;quot;columns&amp;quot; parameter. The columns that are addressable point either to attributes of the top-level message or its headers. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;MessagingService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Header Equivalence&lt;br /&gt;
! Column     !! Refers To&lt;br /&gt;
|-&lt;br /&gt;
|   *column*    |     *refers to*     &lt;br /&gt;
|-&lt;br /&gt;
| id            || The id attribute    &lt;br /&gt;
|-&lt;br /&gt;
| folderId      || The folder attribute &lt;br /&gt;
|-&lt;br /&gt;
| contentType   || The &amp;quot;Content-Type&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| from          || The &amp;quot;From&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| to            || The &amp;quot;To&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| cc            || The &amp;quot;Cc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| bcc           || The &amp;quot;Bcc&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| subject       || The &amp;quot;Subject&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| size          || The size attribute &lt;br /&gt;
|-&lt;br /&gt;
| sentDate      || The &amp;quot;Date&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| receivedDate  || The receivedDate attribute &lt;br /&gt;
|-&lt;br /&gt;
| flags         || The flags attribute &lt;br /&gt;
|-&lt;br /&gt;
| threadLevel   || The threadLevel attribute &lt;br /&gt;
|-&lt;br /&gt;
| dispositionNotificationTo || The &amp;quot;Disposition-Notification-To&amp;quot; header. &lt;br /&gt;
|-&lt;br /&gt;
| priority      || The &amp;quot;X-Priority&amp;quot; header &lt;br /&gt;
|-&lt;br /&gt;
| colorLabel    || The colorLabel attribute &lt;br /&gt;
|-&lt;br /&gt;
| url             || The url attribute &lt;br /&gt;
|-&lt;br /&gt;
| body          || The content attribute &lt;br /&gt;
|-&lt;br /&gt;
| headers       || The headers attribute &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== JSON calls ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* id - The ID of the message to load&lt;br /&gt;
* peek - (optional) if set to &amp;quot;true&amp;quot; the read/unread state of the message will not change. Defaults to false.&lt;br /&gt;
* folder - The folder id&lt;br /&gt;
   &lt;br /&gt;
Response: An Object representing the loaded message.&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/message?action=send&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* recipients - (optional) If set the message is sent to the given list of recipients, otherwise this defaults to the &amp;quot;To&amp;quot; header of the message.&lt;br /&gt;
   &lt;br /&gt;
Request Body: The Request Body should contain the JSON Object representing the message to be sent.&lt;br /&gt;
Response: &amp;quot;1&amp;quot; as the data of a regular response on success.&lt;br /&gt;
&lt;br /&gt;
GET or PUT /ajax/messaging/message?action=perform&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* action - The messaging action to invoke&lt;br /&gt;
* id - The id of the message the action should be invoked on. Only used on actions of type &amp;quot;storage&amp;quot;.&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
   &lt;br /&gt;
Request Body: On actions of type &amp;quot;message&amp;quot; the body should contain the JSON representation of the message the action should be applied to.&lt;br /&gt;
Response: Either 1 if no further user interaction is needed or a messaging message that, after having the user modify it has to be supplied back to the follower action of this action.&lt;br /&gt;
&lt;br /&gt;
Thus, to invoke a messaging action of type &amp;quot;storage&amp;quot; the folder and id are needed. Messaging actions of type &amp;quot;message&amp;quot; need a folder and message in the body. &lt;br /&gt;
Messaging actions of type &amp;quot;none&amp;quot; need a messaging message and account. &lt;br /&gt;
&lt;br /&gt;
==== List style requests ====&lt;br /&gt;
&lt;br /&gt;
GET /ajax/messaging/message?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
* sort - (optional) A column to sort by.&lt;br /&gt;
* order - (optional) The order direction. &amp;quot;asc&amp;quot; for ascending or &amp;quot;desc&amp;quot; for descending. Defaults to &amp;quot;asc&amp;quot;&lt;br /&gt;
* folder - The folder id.&lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the the columns parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/messaging/messages?action=list&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* columns - A comma-separated list of column names.&lt;br /&gt;
&lt;br /&gt;
Request Body: An array of arrays with the folder and id as elements each identifying a message. &lt;br /&gt;
&lt;br /&gt;
Response: An array of arrays with the sub arrays containing the values of the fields asked for by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
== Snippet module (available with v7.0.0/v6.22.0) ==&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=get&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The snippet's JSON representation; e.g.&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;signature&amp;quot;,&lt;br /&gt;
    &amp;quot;props&amp;quot;: {&amp;quot;x-custom&amp;quot;: &amp;quot;any value&amp;quot;},&lt;br /&gt;
    &amp;quot;module&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
    &amp;quot;displayname&amp;quot;: &amp;quot;My signature&amp;quot;,&lt;br /&gt;
    &amp;quot;misc&amp;quot;: {&amp;quot;foo&amp;quot;: &amp;quot;bar&amp;quot;},&lt;br /&gt;
    &amp;quot;createdby&amp;quot;: 17,&lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;-- \\nMy name and position here&amp;quot;,&lt;br /&gt;
    &amp;quot;accountid&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;shared&amp;quot;: false,&lt;br /&gt;
    &amp;quot;files&amp;quot;:&lt;br /&gt;
    [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;mimetype&amp;quot;: &amp;quot;image/png; name=pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;filename&amp;quot;: &amp;quot;pic.png&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;46f49f8a-40d5-4f29-8bc9-728f3420864c&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 6074&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Gets all snippets associated with the current user and context ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=all&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* type		- Optional CSV of types to filter by; e.g. &amp;quot;signature&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets certain snippets by identifiers ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=list&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of snippet identifiers&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
A JSON array of snippets' JSON representations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gets a certain snippet's attachment by identifier ===&lt;br /&gt;
&lt;br /&gt;
GET /ajax/snippet?action=getattachment&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
* attachmentid	- The attachment identifier&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The attachment's raw data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Creates a new snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=new&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The created snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Updates a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=update&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON representation of the snippet providing the fields that should be changed.&lt;br /&gt;
Excluding its attachments (see attach/detach actions)&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's JSON representation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Deletes a certain snippet by identifier ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=delete&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier (otherwise provide one or more identifiers through request body's JSON array)&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array of identifiers denoting the snippets to delete&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
An empty/dummy result (don't care)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Attaches one or more files to an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
POST /ajax/snippet?action=attach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
Multipart form data providing the upload files to attach to the snippet.&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Detaches open or more files from an existing snippet ===&lt;br /&gt;
&lt;br /&gt;
PUT /ajax/snippet?action=detach&lt;br /&gt;
&lt;br /&gt;
* session	- The session identifier&lt;br /&gt;
* id		- The snippet identifier&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
A JSON array providing the identifiers of the attachments to remove from snippet&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The updated snippet's identifier&lt;br /&gt;
&lt;br /&gt;
== Module Halo ==&lt;br /&gt;
&lt;br /&gt;
=== Investigate contact ===&lt;br /&gt;
&lt;br /&gt;
PUT /appsuite/api/halo/contact?action=investigate&lt;br /&gt;
&lt;br /&gt;
The investigate action provides access to different halo providers. &lt;br /&gt;
Each provider requires an own set of parameters and also provides different results. &lt;br /&gt;
The following section describes some but not necessarily all of this providers.&lt;br /&gt;
Each request contains the following common parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; - The provider to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;timezone&amp;lt;/code&amp;gt; - (optional) The timezone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to this parameters a contact must be defined. This can be done either with at least one of the following parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or within the request body.&lt;br /&gt;
&lt;br /&gt;
Request body:&lt;br /&gt;
&lt;br /&gt;
Instead of the contact parameters one can send a JSON object within the body of the request. This body describes the contact.&lt;br /&gt;
If used, it must contain at least one of the fields shown below. If the requests contains a body, the contact specific parameters are ignored. &lt;br /&gt;
It is also possible to provide more contact information. Empty fields are filled up with this values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSON object:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
	&amp;quot;contact_id&amp;quot;:12345&lt;br /&gt;
	&amp;quot;internal_userid&amp;quot;:12345&lt;br /&gt;
	&amp;quot;email1&amp;quot;: mail1@domain.com&lt;br /&gt;
	&amp;quot;email2&amp;quot;: mail2@domain2.com&lt;br /&gt;
	&amp;quot;email3&amp;quot;: mail3@domain3.com&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
The request responds with a JSON object. The content and structure of this object depends on the chosen provider. &lt;br /&gt;
In each case the response contains only data known to the server. Therefore some or all fields may be null.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.contacts &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for contacts are defined in [[#CommonObjectData | Common object data]] and [[#DetailedContactData | Detailed contact data]].&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
&lt;br /&gt;
A JSON array with the contact informations specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.appointments &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Requests parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; – A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for tasks are defined in [[#CommonObjectData | Common object data]], [[#DetailedTaskAndAppointmentData | Detailed task and appointment data]] and [[##DetailedTaskData | Detailed task data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - The start point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; - The end point in milliseconds since 01.01.1970&lt;br /&gt;
* &amp;lt;code&amp;gt;sort&amp;lt;/code&amp;gt; (optional) – The identifier of a column which determines the sort order of the response. If this parameter is specified, then the parameter order must be also specified.&lt;br /&gt;
* &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; (optional) – &amp;quot;asc&amp;quot; if the response entires should be sorted in the ascending order, &amp;quot;desc&amp;quot; if the response entries should be sorted in the descending order. If this parameter is specified, then the parameter sort must be also specified.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
	&lt;br /&gt;
A JSON array of appointments. Each appointment contains the fields specified by the columns parameter. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt; Provider: com.openexchange.halo.mail &amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Request parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; - A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for mails are defined in [[#DetailedMailData | Detailed mail data]].&lt;br /&gt;
* &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; - The maximum number of mails within the result.&lt;br /&gt;
&lt;br /&gt;
Request response: &lt;br /&gt;
	&lt;br /&gt;
A JSON array of mails. Each mail contains the fields specified by the columns parameter.&lt;br /&gt;
&lt;br /&gt;
=== Get halo services ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact?action=services&lt;br /&gt;
&lt;br /&gt;
Request parameter: &lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request response:&lt;br /&gt;
 &lt;br /&gt;
A JSON object with a &amp;quot;data&amp;quot; field which contains an array of all available halo providers.&lt;br /&gt;
&lt;br /&gt;
=== Get contact picture ===&lt;br /&gt;
&lt;br /&gt;
GET /appsuite/api/halo/contact/picture&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - (optional) falls back to the public session cookie&lt;br /&gt;
* &amp;lt;code&amp;gt;internal_userid&amp;lt;/code&amp;gt; - (optional)  The internal user id of a user whose picture you want to load&lt;br /&gt;
* &amp;lt;code&amp;gt;userid&amp;lt;/code&amp;gt; - (optional) an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;user_id&amp;lt;/code&amp;gt; - (optional)  an alias for internal_userid&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; - (optional) a contact id&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; - (optional) an email to search for. Will pick global address book matches before regular matches. After that picks the most recently changed contact&lt;br /&gt;
* &amp;lt;code&amp;gt;email1&amp;lt;/code&amp;gt; - (optional)  an alias for email&lt;br /&gt;
* &amp;lt;code&amp;gt;email2&amp;lt;/code&amp;gt; - (optional) another email address to use to find matches&lt;br /&gt;
* &amp;lt;code&amp;gt;email3&amp;lt;/code&amp;gt; - (optional) and yet another email address to use to find matches&lt;br /&gt;
&lt;br /&gt;
''At least one of the optional search parameters should be set. All parameters are connected by OR during the search. More specific parameters like user_id or id are prioritized in case of multiple matches.''&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
The picture with proper eTag and caching headers set, or an HTTP Status 404 response, if no picture could be found.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;capabilities&amp;quot; (available with v7.4.2) ==&lt;br /&gt;
&lt;br /&gt;
Provides access to capabilities, i.e. modules or features that are available on the backend and the user has access to.&lt;br /&gt;
&lt;br /&gt;
=== Get a capability ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=get&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – The identifier of the capability&lt;br /&gt;
&lt;br /&gt;
Response: The requested capability as described in [[#Capability| Capability]], if available, otherwise an empty result&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Capability&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Capability&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id  || String       || The identifier of the capability&lt;br /&gt;
|-&lt;br /&gt;
| attributes    || Object       || A JSON object holding optional properties of the capability &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get all capabilities ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/capabilities?action=all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Response: An array of capability objects as described in [[#Capability| Capability]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;jump&amp;quot; (available with v7.6.0) ==&lt;br /&gt;
&lt;br /&gt;
The jump module is used to pass an acquired identity token for an authenticated user from one system to another for a single sign-on.&lt;br /&gt;
&lt;br /&gt;
=== Acquire an identity token ===&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/jump?action=identityToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; – The identifier for the external service/system&lt;br /&gt;
&lt;br /&gt;
Response: The acquired identity token wrapped by a simple JSON object as described in [[#Jump| Jump]]&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Jump&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Jump&lt;br /&gt;
! Name        !! Type    !! Value&lt;br /&gt;
|-&lt;br /&gt;
| token  || String       || The identifier of the token&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;find&amp;quot; (preliminary, available with v7.6.1) ==&lt;br /&gt;
The Find API consists of calls for performing searches within the modules mail, contacts, calendar, tasks and drive. It was designed to provide an iterative approach where the search criteria can be refined step-wise until the desired items are found. The starting point is always an &amp;quot;autocomplete&amp;quot; request, that suggests possible search filters based on a users input. Those filters are grouped into categories, called &amp;quot;facets&amp;quot;. A facet may provide one or more &amp;quot;values&amp;quot; with every value being a possible filter. A client is meant to remember every value that was selected by a user and include it within the following &amp;quot;autocomplete&amp;quot; and &amp;quot;query&amp;quot; requests, while &amp;quot;query&amp;quot; performs the actual search and returns the found items.&lt;br /&gt;
&lt;br /&gt;
Every request is bound to a module that must be specified via the URL-Parameter &amp;quot;module&amp;quot;. Possible modules are&lt;br /&gt;
* mail&lt;br /&gt;
* contacts&lt;br /&gt;
* calendar&lt;br /&gt;
* tasks&lt;br /&gt;
* drive&lt;br /&gt;
&lt;br /&gt;
=== General assumptions ===&lt;br /&gt;
Some of the objects returned by the server contain former user input. A client must never interpret  strings as HTML but always as plain text to be not vulnerable for CSS attacks!&lt;br /&gt;
&lt;br /&gt;
=== Calls ===&lt;br /&gt;
The find API provides two dedicated calls under the servlet path &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* action=query&lt;br /&gt;
&lt;br /&gt;
=== Facets ===&lt;br /&gt;
The style of a facet is responsible for how the according object is structured, how it is handled on the server-side and how the client has to handle it.&lt;br /&gt;
We distinguish three styles of facets:&lt;br /&gt;
* simple&lt;br /&gt;
* default&lt;br /&gt;
* exclusive&lt;br /&gt;
&lt;br /&gt;
Every facet value contains an embedded &amp;quot;filter&amp;quot; object. The filter must not be changed by the client, it has to be seen as a black-box. Instead the filters&lt;br /&gt;
of selected facet values have to be copied and sent to the server with the subsequent requests.&lt;br /&gt;
&lt;br /&gt;
==== Simple Facets ====&lt;br /&gt;
A simple facet is a special facet that has exactly one value. The facets&lt;br /&gt;
type and its value are strictly coupled, in a way that a display name for both,&lt;br /&gt;
facet and value would be redundant. A simple facet generally denotes a logical field like&lt;br /&gt;
'phone number'. Internally this logical field can map to several internal fields&lt;br /&gt;
(e.g. 'phone_private', 'phone_mobile', 'phone_business'). In clients the facet as&lt;br /&gt;
a whole can be displayed as a single item. Example: &amp;quot;Search for 'term' in field 'phone&lt;br /&gt;
number'&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;simple&amp;quot; || Denotes that this is a facet of style simple&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
    &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Default Facets ====&lt;br /&gt;
A default facet contains multiple values and may be present&lt;br /&gt;
multiple times in search requests to filter results by a combination of different&lt;br /&gt;
values (e.g. &amp;quot;mails with 'foo' and 'bar' in subject&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;default&amp;quot; || Denotes that this is a facet of style default&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| values || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Default Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
    &amp;quot;values&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
        &amp;quot;item&amp;quot;:{&lt;br /&gt;
          &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
          &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exclusive Facets ====&lt;br /&gt;
An exclusive facet is a facet where the contained values are&lt;br /&gt;
mutually exclusive. That means that the facet must only be present once&lt;br /&gt;
in an autocomplete or query request.&lt;br /&gt;
&lt;br /&gt;
Facet values may be one- or two-dimensional. A one-dimensional value can be displayed as is and contains an according filter object.&lt;br /&gt;
A two-dimensional value contains an array &amp;quot;options&amp;quot; with every option defining different semantics of how the value is used to filter the search results. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| style || &amp;quot;exclusive&amp;quot; || Denotes that this is a facet of style exclusive&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The id of this facet. Unique within an autocomplete response. Can be used to distinguish and filter certain facets.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this facet. If absent, an &amp;quot;item&amp;quot; attribute is present.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this facet. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional).&lt;br /&gt;
|-&lt;br /&gt;
| options || &amp;lt;array&amp;gt; || An array of facet values.&lt;br /&gt;
|-&lt;br /&gt;
| flags || &amp;lt;array&amp;gt; || An array of flags, represented as strings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Value Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Value Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The values id. Unique within one facet.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || A displayable (and localized) name for this value. May be superseded with an &amp;quot;item&amp;quot; attribute. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| item (optional) || &amp;lt;object&amp;gt; || A more complex object to display this value. Attributes are &amp;quot;name&amp;quot;, &amp;quot;detail&amp;quot; (optional) and &amp;quot;image_url&amp;quot; (optional). Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search. Absent if the value contains options.&lt;br /&gt;
|-&lt;br /&gt;
| options (optional) || &amp;lt;array&amp;gt; || An array of options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Exclusive Facet Option Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Option Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;lt;string&amp;gt; || The options id. Unique within a set of options.&lt;br /&gt;
|-&lt;br /&gt;
| name || &amp;lt;string&amp;gt; || The displayable (and localized) name for this option.&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter to refine the search.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
    &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
    &amp;quot;options&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Active Facets ====&lt;br /&gt;
Every value that has been selected by a user must be remembered and provided with every subsequent request. The representation of a facet within a request body differs from the one within an autocomplete response. We call those &amp;quot;active facets&amp;quot;. Their representation is independent from their style.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Active Facet Structure&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Active Facet Structure&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| facet || &amp;lt;string&amp;gt; || The id of the according facet.&lt;br /&gt;
|-&lt;br /&gt;
| value || &amp;lt;string&amp;gt; || The id of the according value. Must always be copied from the value object, not from a possibly according option (in the two-dimensional case).&lt;br /&gt;
|-&lt;br /&gt;
| filter || &amp;lt;object&amp;gt; || The filter object, copied from the value or option.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
According to the users configuration, some restrictions may apply that have to be heeded by clients. Those restrictions can be retrieved via the &amp;quot;config&amp;quot; or the &amp;quot;jslob&amp;quot; modules. The following restrictions may apply:&lt;br /&gt;
&lt;br /&gt;
* A user might have limited access to modules and therefore the Find API may only serve requests for a subset of all possible modules. The configuration object may contain an object with key &amp;quot;modules&amp;quot;. Its value is an array containing all module identifiers that the user is allowed to use. If the user is not allowed to search in any module, the value will be null.&lt;br /&gt;
&lt;br /&gt;
* Some facets can be mandatory, i.e. they must be pre-defined by the client and provided with every request. Whether a facet is mandatory or not is decided on a per-module basis. The configuration object may contain an object with key &amp;quot;mandatory&amp;quot;. Every facet that may be mandatory is specified via its id in that object (e.g. mandatory.folder). The value of such a key is either an array containing all module identifiers, where the facet is mandatory or null, if it is not manadatory in any module.&lt;br /&gt;
  &lt;br /&gt;
* Due to performance reasons the service provider can enforce a minimium number of characters that have to be provided before an autocomplete request may be issued. That property is called &amp;quot;minimumQueryLength&amp;quot; and its value is an integer that specifies the minimum number of characters. If a client does not heed this property, the server will respond with an error if the provided user input is too short.&lt;br /&gt;
&lt;br /&gt;
==== Config Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/config/search?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
            &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                &amp;quot;mail&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;modules&amp;quot;: [&lt;br /&gt;
            &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;contacts&amp;quot;,&lt;br /&gt;
            &amp;quot;calendar&amp;quot;,&lt;br /&gt;
            &amp;quot;tasks&amp;quot;,&lt;br /&gt;
            &amp;quot;drive&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GET http://localhost/appsuite/api/config/minimumSearchCharacters?session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSLob Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET http://localhost/appsuite/api/jslob?action=get&amp;amp;id=io.ox/core&amp;amp;session={{session}}&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;io.ox/core&amp;quot;,&lt;br /&gt;
        &amp;quot;tree&amp;quot;: {&lt;br /&gt;
            &amp;quot;search&amp;quot;: {&lt;br /&gt;
                &amp;quot;modules&amp;quot;: [&lt;br /&gt;
                    &amp;quot;mail&amp;quot;,&lt;br /&gt;
                    &amp;quot;contacts&amp;quot;,&lt;br /&gt;
                    &amp;quot;calendar&amp;quot;,&lt;br /&gt;
                    &amp;quot;tasks&amp;quot;,&lt;br /&gt;
                    &amp;quot;drive&amp;quot;&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;mandatory&amp;quot;: {&lt;br /&gt;
                    &amp;quot;folder&amp;quot;: [&lt;br /&gt;
                        &amp;quot;mail&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;minimumQueryLength&amp;quot;: 0&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocomplete ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=autocomplete&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* limit=&amp;lt;int&amp;gt; - The maximum number of values returned per facet&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the users input (specified as &amp;quot;prefix&amp;quot;), already selected facets and possible options.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=autocomplete&amp;amp;module=mail&amp;amp;limit=3&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;prefix&amp;quot;:&amp;quot;test&amp;quot;,  &lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;facets&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;global&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;simple&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;filter&amp;quot;:{},&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },      &lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;contacts&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;default&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;People&amp;quot;,&lt;br /&gt;
        &amp;quot;values&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;contact/424242669/525793&amp;quot;,&lt;br /&gt;
            &amp;quot;item&amp;quot;:{&lt;br /&gt;
              &amp;quot;name&amp;quot;:&amp;quot;Test Usere2123&amp;quot;,&lt;br /&gt;
              &amp;quot;detail&amp;quot;:&amp;quot;testuse1212r@example.com&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;options&amp;quot;:[&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;from&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;to&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              },&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;all&amp;quot;,&lt;br /&gt;
                &amp;quot;name&amp;quot;:&amp;quot;From/To&amp;quot;,&lt;br /&gt;
                &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;time&amp;quot;,&lt;br /&gt;
        &amp;quot;style&amp;quot;:&amp;quot;exclusive&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;Time&amp;quot;,&lt;br /&gt;
        &amp;quot;options&amp;quot;:[&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_week&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last week&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_month&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last month&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;id&amp;quot;:&amp;quot;last_year&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;:&amp;quot;last year&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;:{}&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;flags&amp;quot;:[]&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== query ===&lt;br /&gt;
Mandatory URL parameters:&lt;br /&gt;
* action=query&lt;br /&gt;
* module=&amp;lt;module-name&amp;gt;&lt;br /&gt;
* session=&amp;lt;session-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional URL parameters:&lt;br /&gt;
* columns=&amp;lt;column-ids&amp;gt; - A comma-separated list of the module-specific columns that shall be contained in the response items.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object containing the selected facets and possible options. For pagination the keys &amp;quot;start&amp;quot; and &amp;quot;size&amp;quot; can be set.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT http://localhost/appsuite/api/find?action=query&amp;amp;module=mail&amp;amp;columns=102,600,601,602,603,604,605,607,608,610,611,614,652&amp;amp;session={{session}}&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;facets&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;folder&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:null&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;facet&amp;quot;:&amp;quot;subject&amp;quot;,&lt;br /&gt;
      &amp;quot;value&amp;quot;:1409579708116,&lt;br /&gt;
      &amp;quot;filter&amp;quot;:{&lt;br /&gt;
        &amp;quot;fields&amp;quot;:[&lt;br /&gt;
          &amp;quot;subject&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;queries&amp;quot;:[&lt;br /&gt;
          &amp;quot;lorem&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;options&amp;quot;:{&lt;br /&gt;
    &amp;quot;timezone&amp;quot;:&amp;quot;UTC&amp;quot;,&lt;br /&gt;
    &amp;quot;admin&amp;quot;:false&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start&amp;quot;:0,&lt;br /&gt;
  &amp;quot;size&amp;quot;:101&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;:{&lt;br /&gt;
    &amp;quot;num_found&amp;quot;:-1,&lt;br /&gt;
    &amp;quot;start&amp;quot;:0,&lt;br /&gt;
    &amp;quot;size&amp;quot;:1,&lt;br /&gt;
    &amp;quot;results&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;color_label&amp;quot;:0,&lt;br /&gt;
        &amp;quot;id&amp;quot;:&amp;quot;110458&amp;quot;,&lt;br /&gt;
        &amp;quot;folder_id&amp;quot;:&amp;quot;default0/INBOX&amp;quot;,&lt;br /&gt;
        &amp;quot;attachment&amp;quot;:false,&lt;br /&gt;
        &amp;quot;from&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;John Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;john.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;to&amp;quot;:[&lt;br /&gt;
          [&lt;br /&gt;
            &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
            &amp;quot;jane.doe@example.com&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cc&amp;quot;:[&lt;br /&gt;
&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;subject&amp;quot;:&amp;quot;Lorem Ipsum&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;:7501,&lt;br /&gt;
        &amp;quot;received_date&amp;quot;:1408531387000,&lt;br /&gt;
        &amp;quot;flags&amp;quot;:32,&lt;br /&gt;
        &amp;quot;priority&amp;quot;:3,&lt;br /&gt;
        &amp;quot;account_name&amp;quot;:&amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
        &amp;quot;account_id&amp;quot;:0&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Available Options ===&lt;br /&gt;
Every request body may contain an &amp;quot;options&amp;quot; object to finetune some specific behavior. Currently possible options are:&lt;br /&gt;
* timezone: &amp;lt;tz-name&amp;gt; - The timezone to use if any dates are returned.&lt;br /&gt;
* admin: &amp;lt;boolean&amp;gt; - true to include the context admin if it matches any search criteria. If the context admin shall always be ignored (i.e. not returned), false has to be set.&lt;br /&gt;
&lt;br /&gt;
=== Possible Flags ===&lt;br /&gt;
Every facet may carry one or more flags that describe further aspects of that facet. Currently possible flags are:&lt;br /&gt;
* conflicts - Specified in the form of &amp;quot;conflicts:&amp;lt;other-id&amp;gt;&amp;quot;. A facet carrying this flag must not be combined with a facet of type &amp;lt;other-id&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;share/management&amp;quot; (preliminary, available with v7.8.0) ==&lt;br /&gt;
&lt;br /&gt;
Share links and can be created and managed via different actions in the &amp;quot;share/management&amp;quot; module. Additionally, there are dedicated actions to list all shares of a user in the modules [[#Get_shared_folders_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;folders&amp;quot;]] and [[#Get_shared_infoitems_.28Since_7.8.0.2C_Preliminary.29|&amp;quot;files&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== Get a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: Basic information about an already existing or newly created share link as described in [[#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Target&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| module || String || The folder's module name, i.e. one of &amp;quot;tasks&amp;quot;, &amp;quot;calendar&amp;quot;, &amp;quot;contacts&amp;quot;, &amp;quot;infostore&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| folder || String || The folder identifier &lt;br /&gt;
|-&lt;br /&gt;
| item   || String || (Optional) The object identifier, in case the share targets a single item &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;ShareLink&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Share Link&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| url   || String  || The link to the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| entity   || Number  || The identifier of the anonymous user entity for the share (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| is_new   || Boolean  || Whether the share link is new, i.e. it has been created by the &amp;lt;tt&amp;gt;getLink&amp;lt;/tt&amp;gt;-request, or if it already existed  (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| expiry_date || Time   ||  (Optional) The end date / expiration time after which the share link is no longer accessible.&lt;br /&gt;
|-&lt;br /&gt;
| password || String || (Optional) An additional secret / pin number an anonymous user needs to enter when accessing the share&lt;br /&gt;
|-&lt;br /&gt;
| meta || JSON || (Optional) Arbitrary JSON data saved along with the share as specified by client &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Update a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; – The last modified timestamp of the link to be updated. Used to detect concurrent modifications.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in [[#ShareLink|Share Link]] containing the properties of the link to update., as well as the share target itself as described in [[#ShareTarget|Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Delete a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be deleted for as described in [[#ShareTarget|Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response with timestamp: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
=== Send a link ===&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/share/management?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: The share target where the link should be generated for as described in [[#ShareTarget|Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. To send a custom message to the recipients, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional message can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the warnings array of the response.&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;drive&amp;quot; ==&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side. &lt;br /&gt;
&lt;br /&gt;
A detailed description can be found in a sepearet article: [[OX_Drive_API|OX Drive API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Module &amp;quot;passwordchange&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Users can change their password via the &amp;quot;passwordchange&amp;quot; module. &lt;br /&gt;
&lt;br /&gt;
=== Update password ===&lt;br /&gt;
&lt;br /&gt;
Note: The new password will be set without any checks. The client must ensure that it is the password the user wants to set. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/passwordchange?action=update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; – A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON object as described in PasswordChange.&lt;br /&gt;
&lt;br /&gt;
Response: An empty JSON result in case of no errors.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;PasswordChange&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Password change&lt;br /&gt;
! Name                 !! Type   !! Value&lt;br /&gt;
|-&lt;br /&gt;
| old_password || String || The users' current password or 'null' if the password wasn't set before (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
| new_password || String || The new password the user wants to set or 'null' to remove the password (especially for guest users)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File Storage Services ==&lt;br /&gt;
&lt;br /&gt;
File storage services represents a file storage backend; e.g. Drive, Dropbox, etc.&lt;br /&gt;
&lt;br /&gt;
A *File Storage Service* Object has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageService&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Service&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id            || String      || Identifies a file storage service. Example: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| displayName   || String      || Human readable display name of the service. Example: &amp;quot;Box File Storage Service&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| configuration || JSON object      || A description for dynamic form fields. Same as in PubSub &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are:&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileservice?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
   &lt;br /&gt;
Response: A standard response object containing an array of file storage service objects. &lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileservice?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module. &lt;br /&gt;
* id - The ID of the file storage service to load&lt;br /&gt;
&lt;br /&gt;
Response: A standard response object containing a file storage service object.&lt;br /&gt;
&lt;br /&gt;
== File Storage Accounts ==&lt;br /&gt;
&lt;br /&gt;
A file storage account represents the concrete configuration of an account of a given file storage service.&lt;br /&gt;
A *file storage account* has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileStorageAccount&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Storage Account&lt;br /&gt;
! Field     !! Type   !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id           || String      || Identifies a given file storage account in the scope of its file storage service (Infostore, Dropbox.com, Google OneDrive etc.). This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| filestorageService || String  || The identifier of the file storage service this account belongs to &lt;br /&gt;
|-&lt;br /&gt;
| qualifiedId || String || Identifies a given file storage account globally, i.e. accross all file storage services. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| displayName || String || User chosen String to identify a given account. Will also be translated into the folder name of the folder representing the accounts content &lt;br /&gt;
|-&lt;br /&gt;
| rootFolder || String || ID of the accounts root folder within the folder tree. This is not writeable and is generated by the server &lt;br /&gt;
|-&lt;br /&gt;
| isDefaultAccount || Boolean || Whether this account is the users default account. Exactly one account will have this flag set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| configuration || Object || Configuration data according to the formDescription of the relevant file storage service &lt;br /&gt;
|-&lt;br /&gt;
| capabilities || List of Strings || A list of capability names. Possible values are: &amp;quot;FILE_VERSIONS&amp;quot;, &amp;quot;EXTENDED_METADATA&amp;quot;, &amp;quot;RANDOM_FILE_ACCESS&amp;quot;, &amp;quot;LOCKS&amp;quot; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available JSON calls are&lt;br /&gt;
&lt;br /&gt;
=== Create a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=new&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the account to be created.&lt;br /&gt;
Response: A response object containing the new account id as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update a file storage account ===&lt;br /&gt;
PUT /ajax/fileaccount?action=update&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
&lt;br /&gt;
Request body: A JSON Object describing the update to the account. Note that the &amp;quot;id&amp;quot; and &amp;quot;filestorageService&amp;quot; must always be set.&lt;br /&gt;
Response: A response object containing the number 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=get&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to load&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing the JSON Object representing the loaded account as its data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delete a file storage account ===&lt;br /&gt;
GET /ajax/fileaccount?action=delete&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module.&lt;br /&gt;
* filestorageService - The file storage service id that the account belongs to&lt;br /&gt;
* id - An account ID to delete&lt;br /&gt;
&lt;br /&gt;
Response: A response object containing 1 as its data on success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get all available file storage accounts ===&lt;br /&gt;
GET /ajax/fileaccount?action=all&lt;br /&gt;
&lt;br /&gt;
* session - A session ID previously obtained from the login module&lt;br /&gt;
* filestorageService - (optional) list only those accounts that belong to the given file storage service.&lt;br /&gt;
 &lt;br /&gt;
Response: A response object containing a JSON array of account objects in its data section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example for creating a new OAuth-based file storage account ===&lt;br /&gt;
&lt;br /&gt;
First, get the description of the file storage service for which a new account is supposed to be created:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/fileservice?action=get&amp;amp;id=boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   {&lt;br /&gt;
    id: &amp;quot;boxcom&amp;quot;&lt;br /&gt;
    displayName: &amp;quot;Box File Storage Service&amp;quot;&lt;br /&gt;
    configuration: {&lt;br /&gt;
      widget: &amp;quot;oauthAccount&amp;quot;&lt;br /&gt;
      options: {&lt;br /&gt;
        type: &amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      name: &amp;quot;account&amp;quot;&lt;br /&gt;
      displayName: &amp;quot;Select an existing account&amp;quot;&lt;br /&gt;
      mandatory: true&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next get the associated OAuth account information:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /ajax/oauth/accounts?action=all&amp;amp;serviceId=com.openexchange.oauth.boxcom&amp;amp;session=...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response might be:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  {&amp;quot;data&amp;quot;:[{&amp;quot;id&amp;quot;:333,&amp;quot;displayName&amp;quot;:&amp;quot;My Box.com account&amp;quot;,&amp;quot;serviceId&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;}]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create the file storage account:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  PUT /ajax/fileaccount?action=new&amp;amp;session=...&lt;br /&gt;
  &lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;filestorageService&amp;quot;:&amp;quot;boxcom&amp;quot;,&lt;br /&gt;
    &amp;quot;displayName&amp;quot;:&amp;quot;My box.com account&amp;quot;,&lt;br /&gt;
    &amp;quot;configuration&amp;quot;:{&lt;br /&gt;
      &amp;quot;account&amp;quot;:&amp;quot;333&amp;quot;,&lt;br /&gt;
      &amp;quot;type&amp;quot;:&amp;quot;com.openexchange.oauth.boxcom&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response provides the relative (in context of the according file storage service) identifier of the newly created account:&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;data&amp;quot;:19}&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=CalDAVClients&amp;diff=21086</id>
		<title>CalDAVClients</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=CalDAVClients&amp;diff=21086"/>
		<updated>2015-12-14T12:59:10Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Open-Xchange Calendar synchronization with CalDAV =&lt;br /&gt;
&lt;br /&gt;
This site describes how the Open-Xchange server can be accessed via its CalDAV interface after the server has been configured as described in [[Caldav_carddav_Bundles]]. Depending on the used client software, different steps are necessary. Other clients may be configured similarly, but are not officially supported.&lt;br /&gt;
&lt;br /&gt;
== Mac OS X Calendar ==&lt;br /&gt;
&lt;br /&gt;
For the Calendar application on Mac OS X 10.9 (Mavericks) and above, a CalDAV account can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:caldav-account4.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Choose &amp;quot;Calendar&amp;quot; -&amp;gt; &amp;quot;Add Account...&amp;quot; from the Calendar App main Menu&lt;br /&gt;
* In the &amp;quot;Choose Calendar Account Provider...&amp;quot; Menu choose &amp;quot;Other CalDAV-Account...&amp;quot;&lt;br /&gt;
* In the &amp;quot;Add a CalDAV Account&amp;quot; Menu choose &amp;quot;Account Type&amp;quot; &amp;quot;Manual&amp;quot;&lt;br /&gt;
* In the &amp;quot;User name&amp;quot; field enter your username&lt;br /&gt;
* In the &amp;quot;Password&amp;quot; field enter your password&lt;br /&gt;
* In the &amp;quot;Server address&amp;quot; field enter your server address '''with the prefix &amp;quot;dav.&amp;quot; (e.g. &amp;quot;dav.myserver.tld&amp;quot;)'''.&lt;br /&gt;
* Click &amp;quot;Sign In&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Debug Options ===&lt;br /&gt;
You can enable a Debug Menu inside the iCal application which gives you access to advanced debugging and logging options. Please notice that some of these options may increase the size of the log files of your system and/or could also log sensitive data like passwords if enabled. Keep also in mind that any setting changed here will remain active until the setting itself will be reverted or changed again which means that disabling the Debug Menu itself is not sufficient to reset any debug settings to their defaults. All settings are case sensitive.&lt;br /&gt;
&lt;br /&gt;
Open a terminal window (Applications &amp;gt; Utilities &amp;gt; Terminal) and issue the following command for&lt;br /&gt;
* enabling the Debug Menu in iCal:&lt;br /&gt;
 defaults write com.apple.iCal CDB 1&lt;br /&gt;
* disabling the Debug Menu in iCal:&lt;br /&gt;
 defaults write com.apple.iCal CDB 0&lt;br /&gt;
* enabling CalDAV HTTP activity logging:&lt;br /&gt;
 defaults write com.apple.iCal LogHTTPActivity -boolean TRUE&lt;br /&gt;
* disabling CalDAV HTTP activity logging:&lt;br /&gt;
 defaults write com.apple.iCal LogHTTPActivity -boolean FALSE&lt;br /&gt;
&lt;br /&gt;
'''Pay attention''': If you change these settings it might be needed to kill the CalendarAgent process with &amp;lt;code&amp;gt;killall CalendarAgent&amp;lt;/code&amp;gt; just restarting the MacOS calendar application might not be enough. So in case you won't see any additional log output in the syslog, or the additional log output doesn't vanish after switching off these setting, please try killing the CalendarAgent process.&lt;br /&gt;
&lt;br /&gt;
== iOS Calendar ==&lt;br /&gt;
&lt;br /&gt;
The iOS Calendar application on the iPhone, iPod or iPad can be configured as follows.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:ios_caldav_config.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Open &amp;quot;Settings&amp;quot;&lt;br /&gt;
* Select &amp;quot;Mail, Contacts, Calendars&amp;quot; -&amp;gt; &amp;quot;Add Account...&amp;quot; -&amp;gt; &amp;quot;Other&amp;quot; -&amp;gt; &amp;quot;Add CalDAV Account&amp;quot;&lt;br /&gt;
* Enter the server address, username as password as shown in the screenshot&lt;br /&gt;
* Click &amp;quot;Next&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Thunderbird/Lightning ==&lt;br /&gt;
''Available since Open-Xchange Server v6.20.7''&lt;br /&gt;
&lt;br /&gt;
The steps below describe how to setup the Mozilla Thunderbird client with the Lightning Add-on. &lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
Please ensure that the following preconditions are met before continuing:&lt;br /&gt;
* Latest versions of the Mozilla Thunderbird E-Mail client and the Lightning Add-on (check https://addons.mozilla.org/thunderbird/addon/lightning/ and http://www.mozilla.org/thunderbird/ for details)&lt;br /&gt;
* In the Mozilla Thunderbird client, an E-Mail account for the user's Open-Xchange mailbox needs to be setup before configuring the CalDAV access&lt;br /&gt;
&lt;br /&gt;
=== Discover the CalDAV URL of your Calendar Folders ===&lt;br /&gt;
In contrast to some other clients, Thunderbird/Lightning is not able to discover all the available calendar collections automatically. Instead, each calendar folder needs to be added seperately in the client. To do so, one needs to know the CalDAV URLs of the calendar folder that should be synchronized with the client. This URL is displayed in the properties-page in the Groupware web-interface.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:CalDAV_URL_Step1.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Open a webbrowser and login to the groupware web-interface&lt;br /&gt;
* From the folder tree, open the context menu of a calendar folder and select &amp;quot;Properties&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[image:CalDAV_URL_Step2.png|thumb]] ||&lt;br /&gt;
* The CalDAV URL is shown in the content area. Note down the URL or copy it to the clipboard.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Add a Calendar in Thunderbird/Lightning ===&lt;br /&gt;
As already mentioned, each Calendar folder that should be sychronized has to be added separately in the client. The following steps show how to add a Calendar in Thunderbird/Lightning. Before starting, ensure that the client is connected to the network and the server can be accessed.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:LightningSetup_Step1.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Select &amp;quot;Events and Tasks&amp;quot; -&amp;gt; &amp;quot;Calendar&amp;quot; from the menu bar to switch to the Calendar view&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step2.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* From the menu bar, select &amp;quot;File&amp;quot; -&amp;gt; &amp;quot;New&amp;quot; -&amp;gt; &amp;quot;Calendar...&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step3.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* In the popup window, select &amp;quot;On the network&amp;quot; and click &amp;quot;Next &amp;gt;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step4.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* As format, select &amp;quot;CalDAV&amp;quot;&lt;br /&gt;
* Enter the CalDAV path as reported by the folder's properties page (see above) as location&lt;br /&gt;
* For offline access, check the &amp;quot;Cache&amp;quot; checkbox &lt;br /&gt;
* Click &amp;quot;Next &amp;gt;&amp;quot; to continue&lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step5.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* Enter a name for the Calendar and assign a color if you like &lt;br /&gt;
* Select whether reminders should be shown or not (recommended setting: off, see below for details)&lt;br /&gt;
* Select the E-Mail account belonging to the Calendar user from the list &lt;br /&gt;
* Click &amp;quot;Next &amp;gt;&amp;quot; to create the Calendar &lt;br /&gt;
|-&lt;br /&gt;
| [[image:LightningSetup_Step6.png|thumb]] || style=&amp;quot;width:85%&amp;quot;| &lt;br /&gt;
* When requested, enter your username and password for the server&lt;br /&gt;
* Afterwards, the Calendar setup is complete and the contents are synchronized&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Debug Options ===&lt;br /&gt;
In case of synchronization problems, the built-in error console of Mozilla Thunderbird may provide valuable information. The error console can be opened via &amp;quot;Tools&amp;quot; -&amp;gt; &amp;quot;Error Console&amp;quot;. To increase the loglevel of the Lightning Add-on, open the config editor by selecting &amp;quot;Tools&amp;quot; -&amp;gt; &amp;quot;Options...&amp;quot; -&amp;gt; &amp;quot;Advanced&amp;quot; -&amp;gt; &amp;quot;Config Editor...&amp;quot; and set the properties &amp;quot;calendar.debug.log&amp;quot; and &amp;quot;calendar.debug.log.verbose&amp;quot; to &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General Limitations ==&lt;br /&gt;
Please consider the following known limitations for the CalDAV interface:&lt;br /&gt;
&lt;br /&gt;
=== Reminders ===&lt;br /&gt;
* While the iCalendar standard allows to set appointment reminders past due an appointment's start-date, the OX server is not able to save such alarm times and discards them.&lt;br /&gt;
* Multiple reminders in an event are not supported by the OX server and are discarded.&lt;br /&gt;
* Only reminders of type &amp;quot;DISPLAY&amp;quot; are supported by the OX server, reminders of other iCal types are discarded.&lt;br /&gt;
* When dismissing reminders of recurring appointments in the Mozilla Lightning client, the reminder is removed from the whole recurring appointment object, since it's not possible to determine to which occurrence the dismiss action belongs to.&lt;br /&gt;
* On iOS devices, when a custom default alert time is configured via Settings -&amp;gt; Mail, Contacts, Calendars -&amp;gt; Default Alert Times, this setting may also affect appointments you don't participate in. This is a client-specific feature and can't be influenced by the server.&lt;br /&gt;
* Due to incompatible handling of reminders in the Mozilla Thunderbird / Lightning client, especially for reminders in recurring appointments, it's recommended to turn off reminders in synchronized calendar folders there (from the context menu of a calendar, select 'Properties' and uncheck 'Show Alarms').&lt;br /&gt;
&lt;br /&gt;
=== Attachments ===&lt;br /&gt;
&lt;br /&gt;
Since v7.8.1, the OX server has support for synchronizing appointment attachments via CalDAV. Attachments are included as so-called managed attachments in the iCal data, which are basically ATTACH properties whose value is a link to the attachment's binary data on the server. More details are available at https://datatracker.ietf.org/doc/draft-daboo-caldav-attachments/ .&lt;br /&gt;
&lt;br /&gt;
Depending on the used client, some specials apply:&lt;br /&gt;
&lt;br /&gt;
==== Mac OS Calendar ====&lt;br /&gt;
* For appointments with existing attachments, the client sometimes refuses to apply local updates and displays a &amp;quot;Are you sure you want to delete the attachment&amp;quot; warning&lt;br /&gt;
* Occasionally, the client crashes when working with appointments having attachments (due to an uncaught internal error)&lt;br /&gt;
* In recurring appointments, there is no separation between the series itself and possible exceptions, i.e. the client displays a combined view of attachments for both the series itself, as well as those files that are attached to an exception instance&lt;br /&gt;
* The same goes for all attachment-related operations in recurring events, i.e. attachments are added, updated and removed from the main series only, regardless of an exception being selected&lt;br /&gt;
* To offer at least basic support for attachments, the server tries to mimic a CalDAV server not being able to support storing managed attachments on a per-recurrence instance basis (i.e., they can only be added to all instances as a whole), which correlates to the &amp;quot;calendar-managed-attachments-no-recurrence&amp;quot; capability)&lt;br /&gt;
&lt;br /&gt;
====eM Client==== &lt;br /&gt;
* In recurring appointments, the client displays both the attachments of the main series, as well as those from the exception. However, not the other way around, i.e. attachments targeting the exception explicitly don't show up in the main series.&lt;br /&gt;
* Besides displaying both attachments from the series as well as those from exception occurrences, the client also indicates all those attachments again when editing an exception again. Therefore, such attachments that already exist in the main series are skipped implicitly when importing the updated appointment again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Unsupported Properties ===&lt;br /&gt;
* Generally, only those appointment and task properties that are also available on the Open-Xchange server are used for synchronization, i.e. all unsupported properties are ignored and not saved.&lt;br /&gt;
* The &amp;quot;URL&amp;quot; property for iCal resources is not supported by the OX server and is discarded.&lt;br /&gt;
* Importing or exporting file attachments (property &amp;quot;ATTACH&amp;quot;) is not supported via the CalDAV interface prior v7.8.1.&lt;br /&gt;
&lt;br /&gt;
=== Private Appointments ===&lt;br /&gt;
* Appointments classified as &amp;quot;private&amp;quot; are exported by the server with the &amp;quot;CLASS&amp;quot; property set to &amp;quot;PRIVATE&amp;quot;.&lt;br /&gt;
* iCal events with the &amp;quot;CLASS&amp;quot; property set to either &amp;quot;CONFIDENTIAL&amp;quot; or &amp;quot;PRIVATE&amp;quot; are treated in the same way by the server and are imported as &amp;quot;private&amp;quot; appointments.&lt;br /&gt;
* Since &amp;quot;private&amp;quot; appointments with participants are not supported by the server, saving such an appointment results in the participants being removed implicitly during import.&lt;br /&gt;
&lt;br /&gt;
=== Tasks ===&lt;br /&gt;
* Only simple tasks (no participants, no recurrence) are supported.&lt;br /&gt;
* Only tasks from personal folders (no shared or public folders) are supported.&lt;br /&gt;
* Only the properties &amp;quot;DTSTART&amp;quot;, &amp;quot;DUE&amp;quot;, &amp;quot;CATEGORIES&amp;quot;, &amp;quot;SUMMARY&amp;quot;, &amp;quot;PRIORITY&amp;quot;, &amp;quot;DESCRIPTION&amp;quot;, &amp;quot;VALARM&amp;quot;, &amp;quot;STATUS&amp;quot;, &amp;quot;PERCENT-COMPLETE&amp;quot; and &amp;quot;COMPLETED&amp;quot; are synchronized, other ones are discarded by the server.&lt;br /&gt;
&lt;br /&gt;
===Creating new Collections===&lt;br /&gt;
* Creating a new collection in the client results in a new folder being created at the server, with the default calendar or tasks folder as its parent. &lt;br /&gt;
* In the Mac OS clients, the name of a new folder may be need to set twice during creation, since the collection's location as chosen by the client changes once after sending it to the server. &lt;br /&gt;
* Note: Due to the lacking support of the MKCALENDAR HTTP request in Apache's mod_ajp module, creating new collections currently only works when using the [[Grizzly]] package on the OX server.&lt;br /&gt;
&lt;br /&gt;
===Permissions in Shared Folders===&lt;br /&gt;
* In a Calendar folder that is shared to the CalDAV user by another groupware user, the Mac OS iCal client does not allow editing appointments where the CalDAV user is not the organizer of the appointment, even if sufficient permissions were granted. This is a built-in restriction of the client, however, you are still able to edit or delete such appointments in the groupware web interface.&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=20870</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=20870"/>
		<updated>2015-11-08T08:21:34Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#File_Metadata]]. If available, the requested metadata of files is included in the corresponsing &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/ajax/help/en_US/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;https://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.4.2-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;2&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.5353 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#File_Metadata|FileMetadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot;: 1418024049629,&lt;br /&gt;
   &amp;quot;modified&amp;quot;: 1418024189166,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this folder.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this folder.&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| content_type || String || The content type of the file.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=20863</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=20863"/>
		<updated>2015-11-04T14:45:15Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads (deprecated, available until API version 2).&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#File_Metadata]]. If available, the requested metadata of files is included in the corresponsing &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/ajax/help/en_US/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;https://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.4.2-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;2&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.5353 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#File_Metadata|FileMetadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot;: 1418024049629,&lt;br /&gt;
   &amp;quot;modified&amp;quot;: 1418024189166,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this folder.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this folder.&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=20855</id>
		<title>OX Drive API</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Drive_API&amp;diff=20855"/>
		<updated>2015-10-30T10:58:10Z</updated>

		<summary type="html">&lt;p&gt;Tobias.friedrich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;OX Drive API&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The module &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt; is used to synchronize files and folders between server and client, using a server-centric approach to allow an easy implementation on the client-side.&lt;br /&gt;
&lt;br /&gt;
The synchronization is based on checksums for files and folders, differences between the server- and client-side are determined using a three-way comparison of server, client and previously acknowledged file- and directory-versions. The synchronization logic is performed by the server, who instructs the client with a set of actions that should be executed in order to come to a synchronized state. &lt;br /&gt;
&lt;br /&gt;
Therefore, the client takes a snapshot of it's local files and directories, calculates their checksums, and sends them as a list to the server, along with a list of previously acknowledged checksums. The server takes a similar snapshot of the files and directories on the underlying file storages and evaluates which further actions are necessary for synchronization. After executing the server-side actions, the client receives a list of actions that should be executed on the client-side. These steps are repeated until the server-state matches the client-state. &lt;br /&gt;
&lt;br /&gt;
Key concept is that the synchronization works stateless, i.e. it can be interrupted and restarted at any time, following the eventual consistency model. &lt;br /&gt;
&lt;br /&gt;
Entry point for the synchronization is the [[#Synchronize_folders|&amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt;]] request, where the directories are compared, and further actions are determined by the server, amongst others actions to synchronize the files in a specific directory using the [[#Synchronize_files_in_a_folder|&amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;]] request. After executing the actions, the client should send another &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request to the server and execute the returned actions (if present), or finish the synchronization if there are no more actions to execute. In pseudo-code, the synchronization routine could be implemented as follows:&lt;br /&gt;
&lt;br /&gt;
 WHILE TRUE&lt;br /&gt;
 {&lt;br /&gt;
   response = SYNCFOLDERS()&lt;br /&gt;
   IF 0 == response.actions.length&lt;br /&gt;
     BREAK&lt;br /&gt;
   ELSE&lt;br /&gt;
     EXECUTE(response.actions)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Basically, it's up to the client how often such a synchronization cycle is initiated. For example, he could start a new synchronization cycle after a fixed interval, if he recognizes that the client directories have changed, or if he is informed that something has changed on the server by an event. It's also up to the client to interrupt the synchronization cycle at any time during execution of the actions and continue later on, however, it's recommended to start a new synchronization cycle each time to avoid possibly outdated actions.&lt;br /&gt;
&lt;br /&gt;
= API =&lt;br /&gt;
&lt;br /&gt;
As part of the [[HTTP_API|HTTP API]], the basic conventions for exchanging messages described there are also valid for this case, especially the [[HTTP_API#Low_level_protocol|low level protocol]] and [[HTTP_API#Error_handling|error handling]]. Each request against the Drive API assumes a valid server session that is uniquely identified by the session id and the corresponding cookies and are sent with each request. A new session can be created via the [[HTTP_API#Module_.22login.22|login module]].&lt;br /&gt;
&lt;br /&gt;
The root folder plays another important role for the message exchange. The root folder has a unique identifier. It is the parent server folder for the synchronization. All path details for directories and files are relative to this folder. This folder's id is sent with each request. To select the root folder during initial client configuration, the client may get a list of synchronizable folders with the [[#Get_synchronizable_Folders|&amp;lt;code&amp;gt;subfolders&amp;lt;/code&amp;gt;]] action.&lt;br /&gt;
&lt;br /&gt;
Subsequently all transferred objects and all possible actions are listed.&lt;br /&gt;
&lt;br /&gt;
== File Version ==&lt;br /&gt;
&lt;br /&gt;
A file in a directory is uniquely identified by its filename and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Directory Version ==&lt;br /&gt;
&lt;br /&gt;
A directory is uniquely identified by its full path, relative to the root folder, and the checksum of its content. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory, including the directory's name, relative to the root folder, e.g. &amp;lt;code&amp;gt;/sub/test/letters&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the checksum of a directory is calculated based on its contents in the following algorithm:&lt;br /&gt;
&lt;br /&gt;
* Build a list containing each file in the directory (not including subfolders or files in subfolders)&lt;br /&gt;
* Ensure a lexicographically order in the following way:&lt;br /&gt;
** Normalize the filename using the &amp;lt;code&amp;gt;NFC&amp;lt;/code&amp;gt; normalization form (canonical decomposition, followed by canonical composition) - see http://www.unicode.org/reports/tr15/tr15-23.html for details&lt;br /&gt;
** Encode the filename to an array of UTF-8 unsigned bytes (array of codepoints)&lt;br /&gt;
** Compare the filename (encoded as byte array &amp;quot;fn1&amp;quot;) to another one &amp;quot;fn2&amp;quot; using the following comparator algorithm:&lt;br /&gt;
&lt;br /&gt;
 min_length = MIN(LENGTH(fn1), LENGTH(fn2))&lt;br /&gt;
 FOR i = 0; i &amp;lt; min_length; i++ &lt;br /&gt;
 {&lt;br /&gt;
   result = fn1[i] - fn2[i]&lt;br /&gt;
   IF 0 != result RETURN result&lt;br /&gt;
 }&lt;br /&gt;
 RETURN LENGTH(fn1) - LENGTH(fn2)&lt;br /&gt;
&lt;br /&gt;
* Calculate the aggregated MD5 checksum for the directory based on each file in the ordered list:&lt;br /&gt;
** Append the file's NFC-normalized (see above) name, encoded as UTF-8 bytes&lt;br /&gt;
** Append the file's MD5 checksum string, encoded as UTF-8 bytes&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
All actions are encoded in the following format. Depending on the action type, not all properties may be present.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Actions&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Actions&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| action || String || The type of action to execute, currently one of &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| version || Object || The (original) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| newVersion || Object || The (new) file- or directory-version referenced by the action.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| offset || Number || The requested start offset in bytes for file uploads.&lt;br /&gt;
|-&lt;br /&gt;
| totalLength || Number || The total length in bytes for file downloads.&lt;br /&gt;
|-&lt;br /&gt;
| contentType || String || The file's content type for downloads.&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's creation time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time).&lt;br /&gt;
|-&lt;br /&gt;
| error || Object || The error object in case of synchronization errors.&lt;br /&gt;
|-&lt;br /&gt;
| quarantine || Boolean || The flag to indicate whether versions need to be excluded from synchronization.&lt;br /&gt;
|-&lt;br /&gt;
| reset || Boolean || The flag to indicate whether locally stored checksums should be invalidated. &lt;br /&gt;
|-&lt;br /&gt;
| stop || Boolean || The flag to signal that the client should stop the current synchronizsation cycle. &lt;br /&gt;
|-&lt;br /&gt;
| acknowledge || Boolean || The flag to signal if the client should not update it's stored checksums when performing an &amp;lt;code&amp;gt;EDIT&amp;lt;/code&amp;gt; action. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnailLink || String || A direct link to a small thumbnail image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| previewLink || String || A direct link to a medium-sized preview image of the file if available (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLink || String || A direct link to the detail view of the file in the web interface (deprecated, available until API version 2). &lt;br /&gt;
|-&lt;br /&gt;
| directLinkFragments || String || The fragments part of the direct link (deprecated, available until API version 2). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the used action types:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Acknowledges the successful synchronization of a file- or directory version, i.e., the client should treat the version as synchronized by updating the corresponding entry in its metadata store and including this updated information in all following &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; arrays of the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; actions. Depending on the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameters of the action, the following acknowledge operations should be executed (exemplarily for directory versions, file versions are acknowledged in the same way):&lt;br /&gt;
&lt;br /&gt;
* Example 1: Acknowledge a first time synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the newly synchronized directory version is encoded in the  &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should store the version in his local checksum store and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
      &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Acknowledge a synchronized directory after updates &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; action where the previous directory version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the newly synchronized directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should replace any previously stored entries of the directory version in his local checksum store with the updated version, and send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;7bb1f1a550e9b9ab4be8a12246f9d5fb&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Acknowledge the deletion of a previously synchronized directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; where the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; to acknowledge the deletion of the previously synchronized directory version as found in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The client should remove any stored entries for this directory from his local checksum store, and no longer send this version in the &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; requests. &amp;lt;br /&amp;gt; Note that an acknowledged deletion of a directory implicitly acknowledges the deletion of all contained files and subfolders, too, so the client should also remove those &amp;lt;code&amp;gt;originalVersion&amp;lt;/code&amp;gt;s from his local checksum store.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3525d6f28eb8cb30eb61ab7932367c35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to edit a file- or directory version. This is used for move/rename operations. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is set to the version as sent in the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array of the preceding &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; contains the new name/path the client should use. Unless the optional boolean parameter &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action implies that the client updates its known versions store accordingly, i.e. removes the previous entry for &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and adds a new entry for &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt;.&lt;br /&gt;
When editing a directory version, the client should implicitly take care to create any not exisiting subdirectories in the &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by the client by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Rename a file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target file in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the name found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test_1.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Move a directory &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the source directory is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target directory in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should move the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the path found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. Doing so, the stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1/test2&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3addd6de801f4a8650c5e089769bdb62&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Rename a conflicting file &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt; action where the original client file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the target filename in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should rename the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter to the new filename found in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. If the &amp;lt;code&amp;gt;acknowledge&amp;lt;/code&amp;gt; parameter is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or is not set, the stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be updated, too, to reflect the changes, otherwise, as in this example, no changes should be done to the stored checksums.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;edit&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;fade32203220752f1fa0e168889cf289&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test (TestDrive).txt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;acknowledge&amp;quot; : false,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Contains information about a file version the client should download. For updates of existing files, the previous client version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; parameter is set to the file size in bytes, allowing the client to recognize when a download is finished. Given the supplied checksum, the client may decide on its own if the target file needs to be downloaded from the server, or can be created by copying a file with the same checksum to the target location, e.g. from a trash folder. The file's content type can be retrieved from the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter, similar to the file's creation and modification times that are availble in the &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Download a new file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the file version to download is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; paramter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 536453,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Download an updated file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action where the previous file version is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and the file version to download in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter. The client should download and save the file as indicated by the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; property of the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; in the directory identified by the supplied &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, replacing the previous file. After downloading, the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; should be added to the client's known file versions database, replacing an existing entry for the previous &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;totalLength&amp;quot; : 1599431,&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;download&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;bb198790904f5a1785d7402b0d8c390e&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;contentType&amp;quot; : &amp;quot;application/pdf&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.pdf&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3e0d7541b37d332c42a9c3adbe34aca2&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;created&amp;quot; : 1375276738232,&lt;br /&gt;
   &amp;quot;modified&amp;quot; : 1375343720985&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to upload a file to the server. For updates of existing files, the previous server version is supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. For new files, the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is omitted. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; holds the target file version, i.e. filename and checksum, and should be used for the following &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; request. When resuming a previously partly completed upload, the &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; parameter contains the offset in bytes from which the file version should be uploaded by the client. If possible, the client should set the &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; parameter for the uploaded file, otherwise, the content type falls back to &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Instructs the client to delete a file or directory version. The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter contains the version to delete. A deletion also implies a removal of the corresponding entry in the client's known versions store.&lt;br /&gt;
A concurrent client-side modification of the file/directory version can be detected by comparing the current checksum against the one in the passed &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Remove a file &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the file to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the file identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the file in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;03395a94b57eef069d248d90a9410650&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Remove a directory &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; action where the directory to be removed is encoded as &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. The &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter is not set in the action. The client should delete the directory identified by the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter. A stored checksum entry for the directory in &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; should be removed, too, to reflect the changes.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;remove&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot; : {&lt;br /&gt;
     &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The client should trigger a synchronization of the files in the directory supplied in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter using the &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request. A &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action implies the client-side creation of the referenced directory if it not yet exists, in case of a new directory on the server. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter is not specified, a synchronization of all folders using the &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; request should be initiated by the client. &lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag in the &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should reset his local state before synchronizing the files in the directory. This may happen when the server detects a synchronization cycle, or believes something else is going wrong. Reset means that the client should invalidate any stored original checksums for the directory itself and any contained files, so that they get re-calculated upon the next synchronization. If the &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; flag is set in a &amp;lt;code&amp;gt;SYNC&amp;lt;/code&amp;gt; action without a apecific directory version, the client should invalidate any stored checksums, so that all file- and directory-versions get re-calculated during the following synchronizations. &lt;br /&gt;
&lt;br /&gt;
* Example 1: Synchronize folder &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action with a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;. The client should trigger a &amp;lt;code&amp;gt;syncfiles&amp;lt;/code&amp;gt; request for the specified folder.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: {&lt;br /&gt;
     &amp;quot;path&amp;quot;: &amp;quot;&amp;lt;folder&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot;: &amp;quot;&amp;lt;md5&amp;gt;&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Synchronize all folders &amp;lt;br /&amp;gt; The server sends a &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; action without &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; (or version is //null//). The client should trigger a &amp;lt;code&amp;gt;syncfolder&amp;lt;/code&amp;gt; request, i.e. the client should synchronize all folders.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;sync&amp;quot;,&lt;br /&gt;
   &amp;quot;version&amp;quot;: null&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; ===&lt;br /&gt;
With the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action, file- or directory versions causing a synchronization problem can be identified. The root cause of the error is encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter as described at the [[HTTP_API#Error_handling|HTTP API]]. &lt;br /&gt;
&lt;br /&gt;
Basically, there are two scenarios where either the errorneous version affects the synchronization state or not. For example, a file that was deleted at the client without sufficient permissions on the server can just be downloaded again by the client, and afterwards, client and server are in-sync again. On the other hand, e.g. when creating a new file at the client and this file can't be uploaded to the server due to missing permissions, the client is out of sync as long as the file is present. Therefore, the boolean parameter &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; instructs the client whether the file or directory version must be excluded from the synchronization or not. If it is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, the client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array, and indicate the issue to the enduser. However, if the synchronization itself is not affected and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the client may still indicate the issue once to the user in the background, e.g. as a balloontip notification. &lt;br /&gt;
&lt;br /&gt;
The client may reset it's quarantined versions on it's own, e.g. if the user decides to &amp;quot;try again&amp;quot;, or automatically after a configurable interval. &lt;br /&gt;
&lt;br /&gt;
The server may also decide that further synchronization should be suspended, e.g. in case of repeated synchronization problems. Such a situation is indicated with the parameter &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. In this case, the client should at least cancel the current synchronization cycle. If appropriate, the client should also be put into a 'paused' mode, and the user should be informed accordingly. &lt;br /&gt;
&lt;br /&gt;
There may also be situations where a error or warning is sent to the client, independently of a file- or directory version, e.g. when the client version is outdated and a newer version is available for download.&lt;br /&gt;
&lt;br /&gt;
The most common examples for errors are insufficient permissions or exceeded quota restrictions, see examples below.&lt;br /&gt;
&lt;br /&gt;
* Example 1: Create a file in a read-only folder &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to create files at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-69&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0012&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;3f978a5a54cef77fa3a4d3fe9a7047d2&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 2: Delete a file without sufficient permissions &amp;lt;br /&amp;gt; Besides a new &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; action to restore the locally deleted file again, the server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Further synchronizations are not affected, but the client may still inform the user about the rejected operation. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [&amp;quot;test.png&amp;quot;, &amp;quot;/test&amp;quot;],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;You are not allowed to delete the file \&amp;quot;test.png\&amp;quot; at \&amp;quot;/test\&amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;1358320776-74&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0011&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/test&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.png&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;438f06398ce968afdbb7f4db425aff09&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 3: Upload a file that exceeds the quota &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action where the errorneous file is encoded in the &amp;lt;code&amp;gt;newVersion&amp;lt;/code&amp;gt; parameter and the &amp;lt;code&amp;gt;quarantine&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The client should exclude the version from the &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; array in upcoming &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; requests so that it doesn't affect the synchronization algorithm. The error message and further details are encoded in the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; object of the action.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 3,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The allowed Quota is reached&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;-485491844-918&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;PERMISSION_DENIED&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0016&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : true,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;,&lt;br /&gt;
   &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
     &amp;quot;name&amp;quot; : &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;checksum&amp;quot; : &amp;quot;0ca6033e2a9c2bea1586a2984bf111e6&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 4: Synchronize with a client where the version is no longer supported. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0028&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to interrupt the synchronization cycle. &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : true,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;The client application you're using is outdated and no longer supported - please upgrade to a newer version.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-13&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0028&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client outdated - current: \&amp;quot;0.9.2\&amp;quot;, required: \&amp;quot;0.9.10\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Example 5: Synchronize with a client where a new version of the client application is available. &amp;lt;br /&amp;gt; The server sends an &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action with code &amp;lt;code&amp;gt;DRV-0029&amp;lt;/code&amp;gt; and an appropriate error message. The &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; flag is set to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; to indicate that the synchronization can continue.&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stop&amp;quot; : false,&lt;br /&gt;
   &amp;quot;error&amp;quot; : {&lt;br /&gt;
     &amp;quot;category&amp;quot; : 13,&lt;br /&gt;
     &amp;quot;error_params&amp;quot; : [],&lt;br /&gt;
     &amp;quot;error&amp;quot; : &amp;quot;A newer version of your client application is available for download.&amp;quot;,&lt;br /&gt;
     &amp;quot;error_id&amp;quot; : &amp;quot;103394512-29&amp;quot;,&lt;br /&gt;
     &amp;quot;categories&amp;quot; : &amp;quot;WARNING&amp;quot;,&lt;br /&gt;
     &amp;quot;code&amp;quot; : &amp;quot;DRV-0029&amp;quot;,&lt;br /&gt;
     &amp;quot;error_desc&amp;quot; : &amp;quot;Client update available - current: \&amp;quot;0.9.10\&amp;quot;, available: \&amp;quot;0.9.12\&amp;quot;&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;quarantine&amp;quot; : false,&lt;br /&gt;
   &amp;quot;action&amp;quot; : &amp;quot;error&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
== Synchronize folders ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of all folders, resulting in different actions that should be executed on the client afterwards. This operation typically serves as an entry point for a synchronization cycle.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; - The current client version (matching the pattern &amp;lt;code&amp;gt;^[0-9]+(\\.[0-9]+)*$&amp;lt;/code&amp;gt;). If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current directories below the root directory as a flat list, encoded as [[#Directory_Version|Directory Versions]]. The original versions array contains all previously known directories, i.e. all previously synchronized and acknowledged directories, also encoded as [[#Directory_Version|Directory Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern|File patterns]] and [[#Directory_pattern|Directory patterns]] accordingly. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfolders&amp;amp;root=56&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;7b744b13df4b41006495e1a15327368a&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2/test3&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;c193fae995d9f9431986dcdc3621cd98&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;35d1b51fdefbee5bf81d7ae8167719b8&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test1&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;3ecc97334d7f6bf2b795988092b8137e&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;excluded.txt&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ], &amp;quot;directoryExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;exact&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/temp/*&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (8.0004 ms elapsed, 102 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
           &amp;quot;version&amp;quot; : {&lt;br /&gt;
             &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;56534fc2ddcb3b7310d3ef889bc5ae18&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synchronize files in a folder ==&lt;br /&gt;
&lt;br /&gt;
This request performs the synchronization of a single folder, resulting in different actions that should be executed on the client afterwards. This action is typically executed as result of a &amp;lt;code&amp;gt;syncfolders&amp;lt;/code&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=syncfiles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; (optional) -  A comma-separated list of columns representing additional metadata that is relevant for the client. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#File_Metadata]]. If available, the requested metadata of files is included in the corresponsing &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ACKNOWLEDGE&amp;lt;/code&amp;gt; actions (deprecated, available until API version 2).&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing two JSON arrays named &amp;lt;code&amp;gt;clientVersions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;originalVersions&amp;lt;/code&amp;gt;. The client versions array lists all current files in the client directory, encoded as [[#File_Version | File Versions]]. The original versions array contains all previously known files, i.e. all previously synchronized and acknowledged files, also encoded as [[#File_Version | File Versions]]. &lt;br /&gt;
&lt;br /&gt;
Optionally, available since API version 2, the JSON object may also contain an array named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[#File_pattern | File patterns]]. See [[#Client_side_filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=syncfiles&amp;amp;root=56&amp;amp;path=/test2&amp;amp;device=Laptop&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;clientVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }, {&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ],&lt;br /&gt;
       &amp;quot;originalVersions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;Jellyfish.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot; : &amp;quot;5a44c7ba5bbe4ec867233d67e4806848&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
       &amp;quot;fileExclusions&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;*&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot; : &amp;quot;*.tmp&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot; : &amp;quot;glob&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;path&amp;quot; : &amp;quot;/test2&amp;quot;,&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;upload&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;offset&amp;quot; : 0&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Download a file ==&lt;br /&gt;
&lt;br /&gt;
Downloads a file from the server.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=download&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to download.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the download. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; (optional) - The number of bytes to include in the download stream. If not defined, the file is read until the end.&lt;br /&gt;
&lt;br /&gt;
Request Body: &amp;lt;br /&amp;gt;&lt;br /&gt;
Optionally, available since API version 3, if client-side file- and/or directory exclusion filters are active, a PUT request can be used. The request body then holds a JSON object containing two arrays named &amp;lt;code&amp;gt;fileExclusions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directoryExclusions&amp;lt;/code&amp;gt; to define client-side exclusion filters, with each element encoded as [[File_pattern|File patterns]] and [[Directory_pattern|Directory patterns]] accordingly. See [[Client_side_filtering|Client side filtering]] for details.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the requested file version. Note that in case of errors, an exception is not encoded in the default JSON error format here. Instead, an appropriate HTTP error with a status code != 200 is returned. For example, in case of the requested file being deleted or modified in the meantime, a response with HTTP status code 404 (not found) is sent.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=download&amp;amp;root=56&amp;amp;path=/test2&amp;amp;name=Jellyfish.jpg&amp;amp;checksum=5a44c7ba5bbe4ec867233d67e4806848&amp;amp;offset=0&amp;amp;length=-1&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (20.0011 ms elapsed, 775702 bytes received)&lt;br /&gt;
&lt;br /&gt;
== Upload a file ==&lt;br /&gt;
&lt;br /&gt;
Uploads a file to the server.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=upload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;newName&amp;lt;/code&amp;gt; - The target name of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;newChecksum&amp;lt;/code&amp;gt; - The target checksum of the file version to upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (optional) - The previous name of the file version being uploaded. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The previous checksum of the file version to upload. Only set when uploading an updated version of an existing file to the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; - The API version that the client is using. If not set, the initial version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt; (optional) - The content type of the file. If not defined, &amp;lt;code&amp;gt;application/octet-stream&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; (optional) - The start offset in bytes for the upload when resuming a previous partial upload. If not defined, an offset of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is assumed.&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLength&amp;lt;/code&amp;gt; (optional) - The total expected length of the file (required to support resume of uploads). If not defined, the upload is assumed completed after the operation.&lt;br /&gt;
* &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt; (optional) - The creation time of the file as timestamp.&lt;br /&gt;
* &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; (optional) - The last modification time of the file as timestamp. Defaults to the current server time if no value or a value larger than the current time is supplied.&lt;br /&gt;
* &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; - Expected to be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; to indicate the binary content.&lt;br /&gt;
* &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; (optional) - A friendly name identifying the client device from a user's point of view, e.g. &amp;quot;My Tablet PC&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; (optional) - If set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, an additional diagnostics trace is supplied in the response.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Request body: &amp;lt;br /&amp;gt;&lt;br /&gt;
The binary content of the uploaded file version. &lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. &amp;lt;br /&amp;gt; If the &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt; flag was set (either to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;), this array is wrapped into an additional JSON object in the &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; parameter, and the diagnostics trace is provided at &amp;lt;code&amp;gt;diagnostics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=upload&amp;amp;root=56&amp;amp;path=/test2&amp;amp;newName=Penguins.jpg&amp;amp;newChecksum=9d377b10ce778c4938b3c7e2c63a229a&amp;amp;contentType=image/jpeg&amp;amp;offset=0&amp;amp;totalLength=777835&amp;amp;binary=true&amp;amp;device=Laptop&amp;amp;created=1375343426999&amp;amp;modified=1375343427001&amp;amp;session=5d0c1e8eb0964a3095438b450ff6810f&lt;br /&gt;
   &amp;gt; Content: &lt;br /&gt;
     [application/octet-stream;, 777835 bytes]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (108.0062 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;acknowledge&amp;quot;,&lt;br /&gt;
           &amp;quot;newVersion&amp;quot; : {&lt;br /&gt;
             &amp;quot;name&amp;quot; : &amp;quot;Penguins.jpg&amp;quot;,&lt;br /&gt;
             &amp;quot;checksum&amp;quot; : &amp;quot;9d377b10ce778c4938b3c7e2c63a229a&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Listen for changes (long polling) ==&lt;br /&gt;
&lt;br /&gt;
Listens for server-side changes. The request blocks until new actions for the client are available, or the specified waiting time elapses. May return immediately if previously received but not yet processed actions are available for this client.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=listen&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (optional) - The maximum timeout in milliseconds to wait.&lt;br /&gt;
* &amp;lt;code&amp;gt;pushToken&amp;lt;/code&amp;gt; (optional) - The client's push registration token to associate it to generated events.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing all actions the client should execute for synchronization. Each array element is an action as described in [[#Actions | Actions]]. If there no changes were detected, an empty array is returned. Typically, the client will continue with the next &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; request after the response was processed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=listen&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (63409.6268 ms elapsed, 28 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : [{&lt;br /&gt;
           &amp;quot;action&amp;quot; : &amp;quot;sync&amp;quot;,&lt;br /&gt;
         }&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get quota ==&lt;br /&gt;
&lt;br /&gt;
Gets the quota limits and current usage for the storage the supplied root folder belongs to. Depending on the filestore configuration, this may include both restrictions on the number of allowed files and the total size of all contained files in bytes. If there's no limit, -1 is returned.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=quota&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response: &amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing the quota restrictions inside a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt;. The JSON array contains zero, one or two &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; objects as described below, depending on the filestore configuration. If one or more quota &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;s are missing in the array, the client can expect that there are no limitations for that type. Besides the array, the JSON object also contains a hyperlink behind the &amp;lt;code&amp;gt;manageLink&amp;lt;/code&amp;gt; parameter, pointing to an URL where the user could manage his quota restrictions.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=quota&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (9.6854 ms elapsed, 113 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1109974882,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1577,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;manageLink&amp;quot; : &amp;quot;https://www.example.com/manageQuota&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get Settings ==&lt;br /&gt;
&lt;br /&gt;
Gets various settings applicable for the drive clients.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional) - The locale to use for language-sensitive settings (in the format &amp;lt;code&amp;gt;&amp;lt;2-letter-language&amp;gt;_&amp;lt;2-letter-region&amp;gt;&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;de_CH&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt;). Defaults to the user's configured locale on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object holding the settings as described below. This also includes a JSON array with the property name &amp;lt;code&amp;gt;quota&amp;lt;/code&amp;gt; that contains zero, one or two quota objects as described below, depending on the filestore configuration. If one or more quota types are missing in the array, the client can expect that there are no limitations for that type. &lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Quota&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Quota&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| limit || Number || The allowed limit (either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| use || Number || The current usage (again either number of files or sum of filesizes in bytes).&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The kind of quota restriction, currently either &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt; (size of contained files in bytes) or &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; (number of files).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;Settings&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Settings&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| helpLink || String || A hyperlink to the online help.&lt;br /&gt;
|-&lt;br /&gt;
| quotaManageLink || String || A hyperlink to an URL where the user could manage his quota restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| quota || Array || A JSON array containing the quota restrictions as described above.&lt;br /&gt;
|-&lt;br /&gt;
| serverVersion || String || The server version string.&lt;br /&gt;
|-&lt;br /&gt;
| supportedApiVersion || String || The API version supported by the server.&lt;br /&gt;
|-&lt;br /&gt;
| minApiVersion || String || The API version required to synchronize with the server.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=settings&amp;amp;root=56&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (11.3530 ms elapsed, 318 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
         &amp;quot;quota&amp;quot; : [{&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 107374182400,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 8828427,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;storage&amp;quot;&lt;br /&gt;
           }, {&lt;br /&gt;
             &amp;quot;limit&amp;quot; : 800000000000,&lt;br /&gt;
             &amp;quot;use&amp;quot; : 1559,&lt;br /&gt;
             &amp;quot;type&amp;quot; : &amp;quot;file&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;helpLink&amp;quot; : &amp;quot;http://192.168.32.191/ajax/help/en_US/index.html&amp;quot;,&lt;br /&gt;
         &amp;quot;quotaManageLink&amp;quot; : &amp;quot;https://192.168.32.191/manageQuota&amp;quot;,&lt;br /&gt;
         &amp;quot;serverVersion&amp;quot; : &amp;quot;7.4.2-Rev1&amp;quot;,&lt;br /&gt;
         &amp;quot;supportedApiVersion&amp;quot; : &amp;quot;2&amp;quot;,&lt;br /&gt;
         &amp;quot;minApiVersion&amp;quot; : &amp;quot;1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Subscribe to Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Registers a client device to receive push notifications from the server. The subscription is performed based on the configured root folder ID of the client application that identifies itself with it's device token. Supported services currently include the Apple Push Notification Service (APN) and Google Cloud Messaging (GCM). Trying to perform an identical subscription (same &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;) from the same user account again is treated as a no-op.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (13.6268 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsubscribe from Push-Events ==&lt;br /&gt;
&lt;br /&gt;
Unregisters a previously registered client device to stop receiving push notifications from the server. The same parameters that were used to perform the subscription need to be passed again, which includes the root folder ID,  the device token and the service name.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=unsubscribe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The device's registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=unsubscribe&amp;amp;root=65841&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;service=apn&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (26.0015 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update the subscription token ==&lt;br /&gt;
&lt;br /&gt;
Updates a device's registration token in case a new one was assigned by the service.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=updateToken&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; - The name of the underlying push service to use, currently one of &amp;lt;code&amp;gt;gcm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;apn.macos&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt; - The previous registration token as assigned by the service.&lt;br /&gt;
* &amp;lt;code&amp;gt;newToken&amp;lt;/code&amp;gt; - The new registration token as assigned by the service.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON result.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=updateToken&amp;amp;service=apn&amp;amp;session=51378e29f82042b4afe4af1c034c6d68&amp;amp;token=28919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&amp;amp;newToken=38919862989a1b5ba59c11d5f7cb7ba2b9678be9dd18b033184d04f682013677&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (15.6653 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot; : {&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Deprecated, available until API version 2. &amp;lt;br /&amp;gt;&lt;br /&gt;
Additional metadata of synchronized files is made available via the &amp;lt;code&amp;gt;fileMetadata&amp;lt;/code&amp;gt; request.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=fileMetata&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; -  A comma-separated list of columns to return. Each column is specified by a numeric column identifier. Column identifiers for file metadata are defined in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file versions to get the metadata for. Each object in the array should be sent as [[#File_Version | File Versions]], and needs to be present in the referenced path.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the file metadata in the order of the requested file versions. Each array element describes one file metadata and is itself an array. The elements of each array contain the information specified by the corresponding identifiers in the columns parameter.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadataDeprecated&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata (deprecated)&lt;br /&gt;
! ID !! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| 4 || created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 5 || modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| 702 || name || String || The name of the file, including it's extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 703 || contentType || String || The file's content type, e.g. &amp;quot;image/png&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 708 || checksum || String || The MD5 hash of the file, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| 750 || previewLink || String || A direct link to a medium-sized preview image of the file if available. &lt;br /&gt;
|-&lt;br /&gt;
| 751 || directLinkFragments || String | The fragments part of the direct link that can be used in combination with the [[http://oxpedia.org/index.php?title=HTTP_API#Token_Login_.28since_7.0.1.29 |token login]] method to jump directly to the detail view of the file in the web interface, bypassing the need to login manually. &lt;br /&gt;
|-&lt;br /&gt;
| 752 || directLink || String || A direct link to the detail view of the file in the web interface. &lt;br /&gt;
|-&lt;br /&gt;
| 753 || thumbnailLink || String || A direct link to a small thumbnail image of the file if available. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=fileMetadata&amp;amp;root=97974&amp;amp;path=%2f&amp;amp;columns=702%2c708%2c752%2c750%2c753&amp;amp;session=43aca91a80de42559ff0c2493dd973d0&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;song.mp3&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test1.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;&lt;br /&gt;
       }, {&lt;br /&gt;
         &amp;quot;name&amp;quot; : &amp;quot;test3.txt&amp;quot;,&lt;br /&gt;
         &amp;quot;checksum&amp;quot; : &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]  &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (6.0004 ms elapsed, 140 bytes received)&lt;br /&gt;
 &amp;lt;   Content:&lt;br /&gt;
     [&lt;br /&gt;
       [&amp;quot;image.jpg&amp;quot;, &amp;quot;2b04df3ecc1d94afddff082d139c6f15&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;, &amp;quot;https://192.168.32.191/ajax/files?action=document&amp;amp;folder=97974&amp;amp;id=179629&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179629&amp;quot;], &lt;br /&gt;
       [&amp;quot;song.mp3&amp;quot;, &amp;quot;5a9a91184e611dae3fed162b8787ce5f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;, &amp;quot;https://192.168.32.191/ajax/image/file/mp3Cover?folder=97974&amp;amp;id=179630&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=128&amp;amp;height=90&amp;quot;, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179630&amp;quot;], &lt;br /&gt;
       [&amp;quot;test1.txt&amp;quot;, &amp;quot;7e36f409a042f06ecb88606a97a88c8f&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179626&amp;quot;], &lt;br /&gt;
       [&amp;quot;test3.txt&amp;quot;, &amp;quot;703bc9aabff33faf07cf121dcda12ec8&amp;quot;, &amp;quot;https://192.168.32.191/ox6/index.html#m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;, null, &amp;quot;m=infostore&amp;amp;f=97974&amp;amp;i=179624&amp;quot;]&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
== Get a direct link for a folder/a file into appsuite ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Generate a direct link into appsuite UI for a synchronized file/a synchronized folder and a token for token-based login.&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/ajax/drive?action=jump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file in the synchronized folder given in &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;-parameter. Optional&lt;br /&gt;
* &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt; - [[#Methods | Methods]]&lt;br /&gt;
* &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; - Identifier for tracing every single login request passed between different systems in a cluster. The value should be some token that is unique for every login request. This parameter must be given as URL parameter and not inside the body of the POST request.&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; - Client side identifier for accessing the session later. The value should be some token that is unique for every login request.&lt;br /&gt;
&lt;br /&gt;
Methods:&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;edit&amp;lt;/code&amp;gt;: Open the file in appsuite editor or in text/spreadsheet (if available).&lt;br /&gt;
* &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;: Open the file's/folder's change-permission dialog.&lt;br /&gt;
* &amp;lt;code&amp;gt;version_history&amp;lt;/code&amp;gt;: Open the file's version history summary.&lt;br /&gt;
* &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt;: Open the file's/folder's preview.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array containing the direct link to the file/folder including a server token for token based login.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; POST http://localhost/ajax/drive?action=jump&amp;amp;session=48a289898ad949faaa46c04e7fb422f5&amp;amp;root=9547&amp;amp;path=/path/to/file&amp;amp;name=file_to_edit.txt&amp;amp;method=edit&amp;amp;authId=41763584-8460-11e4-b116-123b93f75dba&lt;br /&gt;
   &amp;gt; Content: clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;redirectUrl&amp;quot;: &amp;quot;http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Use direct link and token with token-based login ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Login to appsuite UI with token-based login via the link created with [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;[direct link]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;clientToken&amp;lt;/code&amp;gt; – Client side identifier for accessing the session. The value must be the same as in [[#Get a direct link for a folder/a file into appsuite | Get a direct link for a folder/a file into appsuite]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://localhost/appsuite#app=io.ox/editor&amp;amp;folder=273264&amp;amp;id=273264/307438&amp;amp;serverToken=7b90972628e34e89bb9a3946d1372c68&amp;amp;clientToken=47d74b1c-81df-11e4-b116-123b93f75cba&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK&lt;br /&gt;
&lt;br /&gt;
== Get synchronizable Folders ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Allows getting a list of folders that are available on the server for synchronization. This request should be used to build up a folder tree and let the user select the root synchronization folder(s). &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=subfolders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; - The ID of the parent folder to get the subfolders for as read from a previously fetched directory metadata object. Optional; if not set, the root available root folders are returned.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON array holding metadata information for all subfolders as defined in [[#DirectoryMetadata | Directory Metadata]], with the &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; array being left out. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=subfolders&amp;amp;session=35cb8c2d1423480692f0d5053d14ba52&lt;br /&gt;
   &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.0252 ms elapsed, 966 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: [{&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.googledrive://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Google Drive&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Freigegebene Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1417164170136,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 1,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Öffentliche Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1224493261628,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1418383637250,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403709956,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403709956,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;All users&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
           &amp;quot;group&amp;quot;: true,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 2147483647,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Guests&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
         &amp;quot;shared&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;com.openexchange.file.storage.dropbox://1/&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Dropbox&amp;quot;,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;9542&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;/Meine Dateien&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: 1320230546147,&lt;br /&gt;
         &amp;quot;modified&amp;quot;: 1426764458823,&lt;br /&gt;
         &amp;quot;default_folder&amp;quot;: true,&lt;br /&gt;
         &amp;quot;has_subfolders&amp;quot;: true,&lt;br /&gt;
         &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;guest&amp;quot;: false&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;]&lt;br /&gt;
       }]&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Creates a new or gets the previously created link for a file or folder that can be used to access the item in a browser by anyone. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to get the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object containing details about the share link, including its URL, as described in [[HTTP_API#ShareLink|Share Link]].&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DriveShareTarget&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Drive Share Target&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || (Optional) The name of the file, including its extension, e.g. &amp;lt;code&amp;gt;test.doc&amp;lt;/code&amp;gt;. Not set if the target is a directory.&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the (file's parent) directory, relative to the root folder.&lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The MD5 hash of the file or directory, expressed as a lowercase hexadecimal number string, 32 characters long, e.g. &amp;lt;code&amp;gt;f8cacac95379527cd4fa15f0cb782a09&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example 1: Get the intial link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
      &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (311.8978 ms elapsed, 118 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: true&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
Example 2: Get an already existing link for a file&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=getLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (78.0547 ms elapsed, 167 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/17bc4ac00d424e85ef5272dd427342438e7f20b415aba46c/4df04226&amp;quot;,&lt;br /&gt;
         &amp;quot;is_new&amp;quot;: false,&lt;br /&gt;
         &amp;quot;expiry_date&amp;quot;: 1451606400000,&lt;br /&gt;
         &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request Body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object as described in [[HTTP_API#ShareLink|Share Link]] containing the properties of the link to update, as well as the share target itself as described in [[#DriveShareTarget|Drive Share Target]]. Only modified fields should be set.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;,&lt;br /&gt;
       &amp;quot;expiry_date&amp;quot;: 1451606400000&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (241.5353 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Delete a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Deletes a previously created link for a file or folder. This action is only available for items marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=deleteLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to delete the link for as described in [[#DriveShareTarget|Drive Share Target]].&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=deleteLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (149.3251 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Send a share link ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sends a notification message for a share link to one or more recipients.&lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=sendLink&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the link for as described in [[#DriveShareTarget|Drive Share Target]]. The recipients are listed in the JSON array named &amp;lt;code&amp;gt;recipients&amp;lt;/code&amp;gt;. Each element of the array is itself a two-element JSON array specifying one recipient. The first element of each address is the personal name, the second element is the email address. Missing address parts are represented by &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; values. Optionally, a custom notification message may be specified in a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; property (otherwise, some default message is used). &lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=sendLink&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;photo.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;bdf3bf1da3405725be763540d6601144&amp;quot;,&lt;br /&gt;
       &amp;quot;recipients&amp;quot;: [&lt;br /&gt;
         [&amp;quot;Otto Example&amp;quot;, &amp;quot;otto@example.com&amp;quot;],&lt;br /&gt;
         [&amp;quot;Horst Example&amp;quot;, &amp;quot;horst@example.org&amp;quot;]&lt;br /&gt;
       ]	   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (260.9242 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Get shares ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets all files and directories within the synchronized tree that are shared to others.&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=shares&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
The metadata of the shared items as a JSON object holding two JSON arrays &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;directories&amp;lt;/code&amp;gt; containing the metadata as defined in [[#File_Metadata|FileMetadata]] and [[#Directory_Metadata|DirectoryMetadata]] respectively.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; GET http://192.168.32.191/ajax/drive?action=shares&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (191.2707 ms elapsed, 5339 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;directories&amp;quot;: [{&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;316770&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;bef03e92c3c675c1a6efddc831ac21b9&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1437989289761,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438176370780,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8340,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 135274497,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;otto@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16175,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/102b560404b3e96c9623be94b3d643829a46b117558d9ec9/31342f1f&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;id&amp;quot;: &amp;quot;300695&amp;quot;,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;cdfb5724f9614290a850ec507aea72a2&amp;quot;,&lt;br /&gt;
           &amp;quot;localized_name&amp;quot;: &amp;quot;sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/sub1/check/sharetest&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1430218822598,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1430218833769,&lt;br /&gt;
           &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 257,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Jens&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true&lt;br /&gt;
         }],&lt;br /&gt;
         &amp;quot;files&amp;quot;: [{&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Chrysanthemum.jpg&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1438177192835,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438177729597,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;preview&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;thumbnail&amp;quot;: &amp;quot;http://127.0.0.1/ajax/files?action=document&amp;amp;folder=309373&amp;amp;id=309373/346541&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 16178,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1224dd0b065f2076b6db0e665f1f441f89f1308ad2a8ad7f/167e4881&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
           &amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Pictures&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;076e3caed758a1c18c91a0e9cae3368f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;data.zip&amp;quot;,&lt;br /&gt;
           &amp;quot;created&amp;quot;: 1427291138800,&lt;br /&gt;
           &amp;quot;modified&amp;quot;: 1438593586254,&lt;br /&gt;
           &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Guest&amp;quot;,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;extended_object_permissions&amp;quot;: [{&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;user&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
               &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;last_name&amp;quot;: &amp;quot;Mander&amp;quot;,&lt;br /&gt;
               &amp;quot;first_name&amp;quot;: &amp;quot;Klaus&amp;quot;,&lt;br /&gt;
               &amp;quot;image1_url&amp;quot;: &amp;quot;/ajax/image/user/picture?id=10&amp;amp;timestamp=1413376661353&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 4,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;Horst Example&amp;quot;,&lt;br /&gt;
             &amp;quot;contact&amp;quot;: {&lt;br /&gt;
               &amp;quot;email1&amp;quot;: &amp;quot;horst@example.com&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             &amp;quot;entity&amp;quot;: 11224,&lt;br /&gt;
             &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;anonymous&amp;quot;,&lt;br /&gt;
             &amp;quot;share_url&amp;quot;: &amp;quot;http://127.0.0.1/ajax/share/1f74962e0b55529663dfbc3b55794ea59b753c9301c0da75/76c846ae&amp;quot;&lt;br /&gt;
           }],&lt;br /&gt;
           &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
           &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
           &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
           &amp;quot;path&amp;quot;: &amp;quot;/Projects/ACME&amp;quot;,&lt;br /&gt;
           &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;&lt;br /&gt;
         }]&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized directory. &lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/ajax/drive?action=getFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directoy metadata as described in [[#DirectoryMetadata|Directory Metadata]].&lt;br /&gt;
&lt;br /&gt;
== Get file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gets metadata of a specific synchronized file. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=getFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object representing the requested directory metadata as described in [[#FileMetadata|File Metadata]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update directory metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized directory. This currently only includes the permissions - which in turn is only allowed for folders marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFolder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the directory to update, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the directory to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; describing the updated folder metadata as described in [[HTTP_API#DetailedFolderData|Detailed Folder Data]]. Currently, only the property &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;folder&amp;quot;: {&lt;br /&gt;
         &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;group&amp;quot;: false,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
           &amp;quot;entity&amp;quot;: 182&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 135274497&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (207.1722 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Update file metadata ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Updates specific metadata of a synchronized file. This currently only includes the object permissions - which in turn is only allowed for files marked as &amp;lt;code&amp;gt;shareable&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=updateFile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - The path to the synchronized folder, relative to the root folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; - The name of the file version to update.&lt;br /&gt;
* &amp;lt;code&amp;gt;checksum&amp;lt;/code&amp;gt; - The checksum of the file version to update.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object named &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; describing the updated file metadata as described in [[HTTP_API#DetailedInfoitemData|Detailed Infoitem Data]]. Currently, only the property &amp;lt;code&amp;gt;object_permissions&amp;lt;/code&amp;gt; is considered. To notify added permission entities, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which an optional &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=updateFolder&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&amp;amp;path=/test&amp;amp;checksum=d41d8cd98f00b204e9800998ecf8427e&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;file&amp;quot;: {&lt;br /&gt;
         &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;guest&amp;quot;,&lt;br /&gt;
           &amp;quot;email_address&amp;quot;: &amp;quot;otto@example.com&amp;quot;,&lt;br /&gt;
           &amp;quot;display_name&amp;quot;: &amp;quot;Otto Example&amp;quot;,&lt;br /&gt;
           &amp;quot;bits&amp;quot;: 16641&lt;br /&gt;
         }]&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (132.7421 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== Notify about shared items ==&lt;br /&gt;
&lt;br /&gt;
Available since API version 4. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(Re-)Sends a share notification to one or more permission entities of a specific shared file or folder. &lt;br /&gt;
&lt;br /&gt;
PUT &amp;lt;code&amp;gt;/ajax/drive?action=notify&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; - A session ID previously obtained from the login module.&lt;br /&gt;
* &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; - The ID of the referenced root folder on the server.&lt;br /&gt;
&lt;br /&gt;
Request body:&amp;lt;br /&amp;gt;&lt;br /&gt;
A JSON object describing the target file- or directory version to send the notification for as described in [[#DriveShareTarget|Drive Share Target]]. The entity IDs of the recipients are listed in the JSON array named &amp;lt;code&amp;gt;entities&amp;lt;/code&amp;gt;. Optionally, an additional JSON object &amp;lt;code&amp;gt;notification&amp;lt;/code&amp;gt; may be included, inside of which a custom &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; can be passed (otherwise, some default message is used).&lt;br /&gt;
&lt;br /&gt;
Response:&amp;lt;br /&amp;gt;&lt;br /&gt;
An empty JSON object. Any transport warnings that occurred during sending the notifications are available in the &amp;lt;code&amp;gt;warnings&amp;lt;/code&amp;gt; array of the response.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 ==&amp;gt; PUT http://192.168.32.191/ajax/drive?action=notify&amp;amp;session=35d55f0bd2284e78a8eb4dba99b1310b&amp;amp;root=9542&lt;br /&gt;
   &amp;gt; Content:&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;path&amp;quot;: &amp;quot;/test&amp;quot;,&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
       &amp;quot;checksum&amp;quot;: &amp;quot;d63540e8f986ec305b0dd1293d8a3276&amp;quot;,&lt;br /&gt;
       &amp;quot;entities&amp;quot;: [10,78],&lt;br /&gt;
       &amp;quot;notification&amp;quot;: {&lt;br /&gt;
         &amp;quot;message&amp;quot;: &amp;quot;Look!&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;== HTTP 200 OK (45.2084 ms elapsed, 11 bytes received)&lt;br /&gt;
 &amp;lt;   Content: &lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;data&amp;quot;: {}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
= File- and Directory Name Restrictions =&lt;br /&gt;
&lt;br /&gt;
Regarding the case sensitivity of file and directory names, OX Drive works in a case-insensitive, but case-preserving way. That means that there cannot be two files with an equal name ignoring case in the same directory, but it's still possible to synchronize the names in a case-sensitive manner, as well as it's possible to change only the case of file- and directory names.&lt;br /&gt;
&lt;br /&gt;
The same applies to equally named files and directories on the same level in the folder hierarchy, i.e. it's not possible to create a new file in a directory where an equally (ignoring case) named subdirectory already exists and vice versa.&lt;br /&gt;
&lt;br /&gt;
There is a similar restriction regarding file and directory names in the same directory having different unicode normalization forms, yet the same textual representation. OX Drive requires uniqueness regarding this textual representaion of potentially different encoded unicode strings. So, in case the client tries to synchronize two textually equal files or directories, he is instructed to put one of them into quarantine. Internally the server performs an equals-check of the &amp;quot;NFC&amp;quot; normalization forms of the strings, i.e. an unicode string is normalized using full canonical decomposition, followed by the replacement of sequences with their primary composites, if possible. Details regarding unicode normalization can be found at http://www.unicode.org/reports/tr15/tr15-23.html .&lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Filenames ==&lt;br /&gt;
&lt;br /&gt;
There are some filenames that are invalid or ignored and therefore not synchronized. This means that files with these names should not be taken into account when sending the directory contents to the server, or when calculating the directory checksum (see below). The following list describes when a filename is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It's case-invariant name without an optional extension matches one of the reserved names &amp;lt;code&amp;gt;CON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AUX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COM9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LPT8&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LPT9&amp;lt;/code&amp;gt;&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored filenames:&lt;br /&gt;
* &amp;lt;code&amp;gt;desktop.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Thumbs.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;icon\r&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename ending with &amp;lt;code&amp;gt;.drivepart&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any filename starting with &amp;lt;code&amp;gt;.msngr_hstr_data_&amp;lt;/code&amp;gt; and ending with &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if the client still insists to send a file version with an invalid or ignored filename, the file creation on the server is refused with a corresponding &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; action (see below). &lt;br /&gt;
&lt;br /&gt;
== Invalid and ignored Directory Names ==&lt;br /&gt;
&lt;br /&gt;
There are also similar restrictions regarding invalid directory names. Any try to include them in the list of directory versions will be responded with a corresponding error action for the directory version. The following list describes when a path is considered invalid:&lt;br /&gt;
* If it contains one or of the following reserved characters: &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (less than), &lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (greater than)&lt;br /&gt;
** &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (colon)&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; (double quote)&lt;br /&gt;
** &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; (backslash)&lt;br /&gt;
** &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (vertical bar or pipe)&lt;br /&gt;
** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; (question mark)&lt;br /&gt;
** &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (asterisk)&lt;br /&gt;
** Characters whose integer representations are in the range from 0 through 31&lt;br /&gt;
* The last character of any subpath (i.e. the last part of the whole path or the part preceding the spearator character &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) is a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (dot) or &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt; (space)&lt;br /&gt;
* It consists solely of whitespace characters&lt;br /&gt;
* It not equals the root path &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, but ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) character&lt;br /&gt;
* It contains two or more consecutive &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (forward slash) characters&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about the ignored directory names:&lt;br /&gt;
* &amp;lt;code&amp;gt;/.drive&amp;lt;/code&amp;gt;&lt;br /&gt;
* Any directory whose path ends with &amp;lt;code&amp;gt;/.msngr_hstr_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Length Restrictions ==&lt;br /&gt;
&lt;br /&gt;
The maximum allowed length for path segments, i.e. the parts between forawrd slashes (&amp;lt;/code&amp;gt;/&amp;lt;/code&amp;gt;) in directory and filenames, is restricted to 255 characters. Synchronizing a file or directory version that contains path segments longer than this limit leads to those versions being put into quarantine.&lt;br /&gt;
&lt;br /&gt;
= Client side filtering =&lt;br /&gt;
&lt;br /&gt;
Client-side filtering is available since API version 2. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
OX Drive clients may define a user- and/or application-defined list of file- and directory name exclusions. Those exclusion filters are then taken into account during synchronization, i.e. files and directories matching a defined exclusion pattern are ignored when comparing the list of server-, client- and original versions. Also, the file exclusion lists are considered for the calculation of aggergated directory checksums.&lt;br /&gt;
&lt;br /&gt;
The exclusion filters may be set, changed or unset at any time during synchronization, there are no additional requests needed to set them up. Instead, the list of excluded files and directories is simply sent along with each &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; request. The following tables show the JSON representation of file- and directory patterns that are used to build up the exlcusion lists:&lt;br /&gt;
&lt;br /&gt;
== Directory pattern ==&lt;br /&gt;
&lt;br /&gt;
A directory pattern is defined by a pattern string and further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryPattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File pattern ==&lt;br /&gt;
&lt;br /&gt;
A file pattern is defined by pattern strings for the filename and path, as well as further attributes.&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FilePattern&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Pattern&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| type || String || The pattern type, currently one of &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path pattern, in a format depending on the pattern type. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The filename pattern, in a format depending on the pattern type.&lt;br /&gt;
|-&lt;br /&gt;
| caseSensitive || Boolean | Optional flag to enable case-sensitive matching, defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pattern types ==&lt;br /&gt;
&lt;br /&gt;
A pattern currently may be defined in two formats: &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; An exact pattern, matching the file- or directory version literally. For example, to exclude the file &amp;lt;code&amp;gt;Backup.pst&amp;lt;/code&amp;gt; in the subfolder &amp;lt;code&amp;gt;Mail&amp;lt;/code&amp;gt; below the root synchronization folder, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; file pattern would look like: &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Mail&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Backup.pst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;, or, an &amp;lt;code&amp;gt;exact&amp;lt;/code&amp;gt; directory pattern for the directory &amp;lt;code&amp;gt;/Archive&amp;lt;/code&amp;gt; would be represented as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;/Archive&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; A simple pattern allowing to use the common wildcards &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; to match file- and directory versions. For example, to exclude all files ending with &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; across all directories, the &amp;lt;code&amp;gt;glob&amp;lt;/code&amp;gt; file pattern could be defined as &amp;lt;code&amp;gt;{&amp;quot;path&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;*.tmp&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}&amp;lt;/code&amp;gt;, or, to exclude the directory &amp;lt;code&amp;gt;/Project/.git&amp;lt;/code&amp;gt; and all its subdirectories recursively, this would be expressed using a combination of the following two directory patterns: &amp;lt;code&amp;gt;[{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exact&amp;quot;},{&amp;quot;path&amp;quot;:&amp;quot;/Project/.git*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;glob&amp;quot;}]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Further considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's possible to exclude a (parent) directory with an appropriate pattern, while still subfolders below that directory being synchronized. This usually results in the excluded directory being created ob both client- and server side, but no file contents within the excluded directory being exchanged. If subfolders should be excluded, too, a wildcard should be used in the pattern to match any subdirectories.&lt;br /&gt;
* If the client tries to synchronize a file- or directory version that is ignored, i.e. a version that would match any of the provided exclusion filters, the server behaves similarly to the handling of invalid and ignored file- and directory names (see above), i.e. the client would be instructed to put those versions into quarantine.&lt;br /&gt;
* For the calculation of directory checksums, it's important that the server and client perform exactly the same matching for ignored filenames: A &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character matches zero or more characters, a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; character matches exactly one character. All other characters are matched literally. Advanced glob flavors like braces to define subpattern alternatives or square brackets for character sets are not used. &lt;br /&gt;
* Client-side filtering is available with API version 2. The API version that is supported by the server is included in the response of the [[#Get Settings | Settings]] request.&lt;br /&gt;
* Whenever there are active exclusion filters, the &amp;lt;code&amp;gt;syncFolders&amp;lt;/code&amp;gt; request should contain all of both directory and file exclusion filter lists. For the &amp;lt;code&amp;gt;syncFiles&amp;lt;/code&amp;gt; request, it's sufficient to include the list of file exclusions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Metadata Synchronization =&lt;br /&gt;
&lt;br /&gt;
The synchronization of metadata is available since API version 3. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Previously, only the &amp;quot;raw&amp;quot; folders and files were synchronized between server and clients. While this is sufficient for basic synchronization, there are cases where the clients could benefit from additional data - &amp;quot;metadata&amp;quot; - that is already available on the server. For example, clients could display directories that have been shared or published to other people in a different way. Or, clients could consider folder permissions directly in case the user is performing a local change that would be rejected by the server in the next synchronization cycle anyway.&lt;br /&gt;
&lt;br /&gt;
To supply the clients with those additional information without any influence on the existing synchronization protocol (!), &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are introduced for each synchronized directory. Regarding synchronization, such files are treated like any other ordinary file. Especially, those files are taken into account when it comes to directory checksum calculation. Doing so, metadata updates result in a changed &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; file, which in turn causes the parent directory checksum to change, hence synchronization is triggered. &lt;br /&gt;
&lt;br /&gt;
However, some special handling applies for those files:&lt;br /&gt;
&lt;br /&gt;
* Clients are not allowed to change metadata, so modifications of metadata files or the deletion of them is rejected. Recovery is done via the protocol here, i.e. the client is instructed to re-download the file.&lt;br /&gt;
* &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files are actually not stored physically on the file storage backend, but created on the fly based on the actual metadata of the directory.&lt;br /&gt;
* Client applications may either store such files on the client file system, or evaluate and store the contained metadata information in a local database for later retrieval. If the file is not saved physically on the client (which is actually recommended), the client is responsible to consider the metadata file in a virtual way and include it's checksum for the directory checksum calculation - similar to the server's internal handling.&lt;br /&gt;
&lt;br /&gt;
Note: Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Metadata format ==&lt;br /&gt;
&lt;br /&gt;
The metadata in &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files is serialized in JSON format to allow easy processing at the clients. The following shows an example of the contents:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;path&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
   &amp;quot;created&amp;quot;: 1418024049629,&lt;br /&gt;
   &amp;quot;modified&amp;quot;: 1418024189166,&lt;br /&gt;
   &amp;quot;own_rights&amp;quot;: 403710016,&lt;br /&gt;
   &amp;quot;permissions&amp;quot;: [{&lt;br /&gt;
     &amp;quot;bits&amp;quot;: 403710016,&lt;br /&gt;
     &amp;quot;group&amp;quot;: false,&lt;br /&gt;
     &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
     &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
     &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;guest&amp;quot;: false&lt;br /&gt;
   }],&lt;br /&gt;
   &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
   &amp;quot;jump&amp;quot;: [&amp;quot;permissions&amp;quot;],&lt;br /&gt;
   &amp;quot;files&amp;quot;: [{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Koala.jpg&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024190565,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418026995663,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;folder=268931&amp;amp;id=268931/297620&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;amp;rotate=true&amp;quot;,&lt;br /&gt;
     &amp;quot;object_permissions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 10,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Klaus Mander&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;klaus.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;bits&amp;quot;: 1,&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 8338,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;horst@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: true&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shared&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1418027394897,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/files?action=document&amp;amp;format=preview_image&amp;amp;folder=268931&amp;amp;id=268931/297621&amp;amp;version=6&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;locked&amp;quot;: true,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 4,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;versions&amp;quot;: [{&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 23,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024198520,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024202878,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 54,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418024234782,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418024231522,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 120,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027349026,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027355957,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;test.txt&amp;quot;,&lt;br /&gt;
       &amp;quot;file_size&amp;quot;: 127,&lt;br /&gt;
       &amp;quot;created&amp;quot;: 1418027370051,&lt;br /&gt;
       &amp;quot;modified&amp;quot;: 1418027366945,&lt;br /&gt;
       &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
         &amp;quot;group&amp;quot;: false,&lt;br /&gt;
         &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
         &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
         &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
         &amp;quot;guest&amp;quot;: false&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;version&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;&lt;br /&gt;
     }],&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;edit&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kalimba.mp3&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: 1418026529047,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 1247549551659,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;modified_by&amp;quot;: {&lt;br /&gt;
       &amp;quot;group&amp;quot;: false,&lt;br /&gt;
       &amp;quot;entity&amp;quot;: 182,&lt;br /&gt;
       &amp;quot;display_name&amp;quot;: &amp;quot;Mander, Jens&amp;quot;,&lt;br /&gt;
       &amp;quot;email_address&amp;quot;: &amp;quot;jens.mander@example.com&amp;quot;,&lt;br /&gt;
       &amp;quot;guest&amp;quot;: false&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;preview&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=800&amp;amp;height=800&amp;quot;,&lt;br /&gt;
     &amp;quot;thumbnail&amp;quot;: &amp;quot;http://192.168.32.191/ajax/image/file/mp3Cover?folder=268931&amp;amp;id=268931/297623&amp;amp;version=1&amp;amp;delivery=download&amp;amp;scaleType=contain&amp;amp;width=100&amp;amp;height=100&amp;quot;,&lt;br /&gt;
     &amp;quot;shareable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;number_of_versions&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
     &amp;quot;version_comment&amp;quot;: &amp;quot;Uploaded with OX Drive (TestDrive)&amp;quot;,&lt;br /&gt;
     &amp;quot;jump&amp;quot;: [&amp;quot;preview&amp;quot;,&lt;br /&gt;
     &amp;quot;permissions&amp;quot;,&lt;br /&gt;
     &amp;quot;version_history&amp;quot;]&lt;br /&gt;
   }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following objects describe the JSON structure of the metadata for a directory:&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;DirectoryMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | Directory Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| id || String || The server-side unique identifier of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| localized_name || String || The localized display name of the directory. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The directory's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the directory the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The folder's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this folder.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this folder.&lt;br /&gt;
|-&lt;br /&gt;
| own_rights || Number|| Folder permissions which apply to the current user, as described in [[HTTP_API#PermissionFlags | Permission Flags]]. &lt;br /&gt;
|-&lt;br /&gt;
| permissions || Array || All folder permissions, each element is an object as described in [[HTTP_API#PermissionObject | Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_permissions || Array || All folder permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedPermissionObject | Extended Permission Object]].&lt;br /&gt;
|-&lt;br /&gt;
| default_folder || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is a default folder, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| has_subfolders || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder (potentially) has subfolders, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| not_synchronizable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the folder is exluded from synchronization, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| type || Number || The special folder type, or not set, if not available. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the folder. &lt;br /&gt;
|-&lt;br /&gt;
| files || Array || Metadata for the contained files, each element is an object as described in [[#FileMetadata | File Metadata]]. Only set if metadata is retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileMetadata&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Metadata&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file the metadata belongs to. &lt;br /&gt;
|-&lt;br /&gt;
| checksum || String || The file's checksum. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| path || String || The path of the parent directory. Only set if metadata is not retrieved through [[#Metadata_Synchronization|Metadata Synchronization]].&lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| preview || String || A URL to a preview image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| thumbnail || String || A URL to a thumbnail image for the file. &lt;br /&gt;
|-&lt;br /&gt;
| object_permissions || Array || All file permissions, each element is an object as described in [[#HTTP_API#ObjectPermissionObject | Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| extended_object_permissions || Array || All file permissions including some additional information, each element is an object as described in [[HTTP_API#ExtendedObjectPermissionObject | Extended Object Permission Object]]. &lt;br /&gt;
|-&lt;br /&gt;
| shared || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is shared, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| shareable || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file can be shared to others by the user, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| locked || Boolean || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file is locked, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; or not set, otherwise. &lt;br /&gt;
|-&lt;br /&gt;
| jump || Array || An array containing the names of possible &amp;lt;code&amp;gt;jump&amp;lt;/code&amp;gt; methods to use for the file. &lt;br /&gt;
|-&lt;br /&gt;
| number_of_versions || Number | The number of all versions of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version || String || The current version identifier (usually, but not necessarily a numerical value) of the file. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String | An additional comment for the file version. &lt;br /&gt;
|-&lt;br /&gt;
| versions || Array || Metadata for all versions of the file, each element is an object as described in [[#File_Version | File Version]]. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;FileVersion&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | File Version&lt;br /&gt;
! Name !! Type !! Value&lt;br /&gt;
|-&lt;br /&gt;
| name || String || The name of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| file_size || Number || The file size of the version in bytes. &lt;br /&gt;
|-&lt;br /&gt;
| created || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| modified || Timestamp || The file version's last modification time (always UTC, not translated into user time). &lt;br /&gt;
|-&lt;br /&gt;
| created_by || Number || User ID of the user who created this object.&lt;br /&gt;
|-&lt;br /&gt;
| modified_by || Number || User ID of the user who last modified this object.&lt;br /&gt;
|-&lt;br /&gt;
| version || String || The version identifier (usually, but not necessarily a numerical value) of the file version. &lt;br /&gt;
|-&lt;br /&gt;
| version_comment || String || An additional comment for the file version. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Client-side implementation ==&lt;br /&gt;
&lt;br /&gt;
In order to make use of the metadata, clients should roughly implement the following:&lt;br /&gt;
* Include the &amp;lt;code&amp;gt;apiVersion&amp;lt;/code&amp;gt; parameter in each request, and set it to at least &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; in order to include &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; during synchronization&lt;br /&gt;
* Evaluate &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files and store the information, as well as the file's checksums in a local database&lt;br /&gt;
* Include this file in the calculation of the parent directory checksum, just like an ordinary file in that directory&lt;br /&gt;
* Do something useful with the metadata information.&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
&lt;br /&gt;
* The metadata synchronization via &amp;lt;code&amp;gt;.drive-meta&amp;lt;/code&amp;gt; files embedded into the synchronization protocol obsoletes the previously used methods to receive metadata information ([[#Get_file_metadata]] and &amp;lt;code&amp;gt;columns&amp;lt;/code&amp;gt; parameter in [[#Synchronize_files_in_a_folder]].&lt;br /&gt;
* Depending on the underlying file storage backend, the included metadata may vary, so each information should be treatened as optional.&lt;br /&gt;
* Embedded metadata synchronization is enabled by default, but can be forcibly disabled by setting the &amp;lt;code&amp;gt;driveMeta&amp;lt;/code&amp;gt; parameter to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in each request.&lt;br /&gt;
&lt;br /&gt;
== Possible use cases ==&lt;br /&gt;
* For files where the &amp;lt;code&amp;gt;locked&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;lock&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the &amp;lt;code&amp;gt;shared&amp;lt;/code&amp;gt; property is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, display some kind of &amp;quot;cloud&amp;quot; icon (-overlay) in the file list / explorer view&lt;br /&gt;
* For files or folders where the user is not allowed to perform an action with, don't offer such actions (e.g. if a file cannot be deleted or renamed by the user due to insufficient permissions, disable the corresponding options)&lt;br /&gt;
* Use the URLs in &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt; to get a preview image for the files&lt;br /&gt;
* Display the server creation / last modification timestamps of files and folders&lt;br /&gt;
* Embed a version history for files with multiple versions&lt;br /&gt;
* Show to which users a file or folder is currently shared&lt;br /&gt;
* Offer appropriate &amp;quot;jump&amp;quot; actions to the groupware web interface for more advanced options (e.g. to directly edit an .xlsx file in the spreadsheet application of the web interface, or to manage a folder's permission&lt;/div&gt;</summary>
		<author><name>Tobias.friedrich</name></author>
	</entry>
</feed>