Syncing

Syncing tasks is the main purpose of most third-party applications. If you use the following recommendations you can sync cleanly and efficiently. One of the most important things is to use the "lastedit_task" and "lastdelete_task" timestamps, returned from Account Info, to determine if any changes have happened on the server before you fetch anything. In the vast majority of cases, when syncing, nothing will have changed on the server and you won't even need to do anything.

There are 7 scenarios that your application must deal with when synchronizing with Toodledo.

Task added in your application

Task edited in your application

Task deleted in your application

Task added on Toodledo

Task edited on Toodledo

Task deleted on Toodledo

Task edited on both Toodledo and your application

For scenarios 1,2 and 3, your application will need to use the "/tasks/add.php", "/tasks/edit.php" or "/tasks/delete.php" API calls to add/edit/delete the task. Adding and deleting can be done without checking, but before you edit a task, you should first fetch it and compare the modification dates to make sure you are not overwriting a more recent version of the task. For scenarios 4,5 and 6, your application will need to use the "/tasks/get.php" and "/tasks/get_deleted.php" API calls to fetch the updated information. For scenario 7, your application will have to compare modification dates and determined that the task has been updated in both places. Your application should prompt the user and ask them which version of the task they want to keep. See the flowchart for an efficient way to handle all scenarios.

Task Datatypes

There are a number of fields that can be set or retrieved when working with tasks. Here is a description of these fields.

id : The server id number for this task. It is guaranteed to be unique per account, but two different accounts may have two different tasks with the same id number.

title : A string for the name of the task. Up to 255 characters.

tag : A comma separated string listing the tags assigned to this task. Up to 250 characters.

folder : The id number of the folder. Omit this field or set it to 0 to leave the task unassigned to a folder.

context : The id number of the context. Omit this field or set it to 0 to leave the task unassigned to a context.

goal : The id number of the goal. Omit this field or set it to 0 to leave the task unassigned to a goal.

location : The id number of the location. Omit this field or set it to 0 to leave the task unassigned to a location.

parent : This is used with Subscriptions that have access to subtasks. To create a subtask, set this to the id number of the parent task. The default is 0, which creates a normal task.

children : This is used with Subscriptions that have access to subtasks. This will indicate the number of child tasks that this task has. This will be 0 for subtasks or for regular tasks without subtasks.

order : This is used with Subscriptions that have access to subtasks. This is an integer that indicates the manual order of subtasks within the parent task. Currently this is read-only.

duedate : A GMT unix timestamp for when the task is due. The time component of this timestamp doesn't matter. When fetching from the server, it will always be noon.

startdate : A GMT unix timestamp for when the task starts. The time component of this timestamp will always be noon.

duetime : A GMT unix timestamp for when the task is due. If the task does not have a time set, then this will be 0. If the task has a duetime without a duedate set, then the date component of this timestamp will be Jan 1, 1970. Times are stored as floating times. In other words, 10am is always 10am, regardless of your timezone. You can convert this timestamp to a GMT string and display the time component without worrying about timezones.

starttime : A GMT unix timestamp for when the task starts. If the task does not have a time set, then this will be 0. If the task has a starttime without a startdate set, then the date component of this timestamp will be Jan 1, 1970. Times are stored as floating times. In other words, 10am is always 10am, regardless of your timezone. You can convert this timestamp to a GMT string and display the time component without worrying about timezones.

remind : An integer that represents the number of minutes prior to the duedate/time that a reminder will be sent. Set it to 0 for no reminder. Values will be constrained to this list of valid numbers (0, 1, 15, 30, 45, 60, 90, 120, 180, 240, 1440, 2880, 4320, 5760, 7200, 8640, 10080, 20160, 43200). Additionally, if the user does not have a Subscription, the only valid numbers are 0,60. If you submit an invalid number, it will be rounded up or down to a valid non zero value.

repeat : A string indicating how the task repeats. When a task is rescheduled, it is moved forward to the new date. For record keeping purposes, a completed copy of this task will be added to the user's list. It will have a new ID number and will be already completed. To make a task no longer repeat, set this field to an empty string.

This string is in the standard iCal RRULE format. For example: "FREQ=DAILY" or "FREQ=WEEKLY;BYDAY=TU". Not every valid iCal RRULE is understood by Toodledo, but we will be improving our ability to understand more options in the future. Please read our repeat format FAQ for details about how we can currently repeat tasks. Note that users enter their repeat settings using a GUI or by typing a human readable string. These get converted to iCal rules behind the scenes.

There are three enhancements to the iCal RRULE format that we have made to support some advanced Toodledo features.

Subtasks can repeat based on their parent's repeat value. There is not a comparable iCal RRULE for this, so we have a custom RRULE of "PARENT" to indicate this setting.

Tasks can be set to repeat from their due-date or their completion date. There is not a way to indicate this in a standard iCAL RRULE. To indicate this, we have a custom string of ";FROMCOMP" that we append to the RRULE if the task is set to repeat from the completion date. The absence of this string means that the task repeats from the due-date.

Normally, when a task is rescheduled it moves forwards by 1 occurrence. If the user has procrastinated, the new due-date could still be in the past. Toodledo will have the option to indicate that certain repeating tasks should be rescheduled to the next future occurance of the task. If this is the case, the custom ";FASTFORWARD" string will be appended to the RRULE.

status : An integer that represents the status of the task.

0 = None

1 = Next Action

2 = Active

3 = Planning

4 = Delegated

5 = Waiting

6 = Hold

7 = Postponed

8 = Someday

9 = Canceled

10 = Reference

length : An integer representing the number of minutes that the task will take to complete.

priority : An integer that represents the priority.

-1 = Negative

0 = Low

1 = Medium

2 = High

3 = Top

star : A boolean (0 or 1) that indicates if the task has a star or not.

modified : A GMT unix timestamp for when the task was last modified.

completed : A GMT unix timestamp for when the task was completed. If the task is not completed, the value will be 0. Toodledo does not track the time that a task was completed, so tasks will always appear to be completed at noon.

added : A GMT unix timestamp for when the task was added. Toodledo does not track the time that a task was added, so tasks will always appear to be added at noon.

timer : The value in the timer field indicates the number of seconds that have elapsed for the timer not including the current session.

timeron : If the timer is currently on, this will contain a unix timestamp indicating the last time that the timer was started. Therefore, if the timer is currently on, you will need to calculate the elapsed time when you present it to the user. This calculation is: Total Time=timer+(now-timeron). Where "now" is a unix timestamp for the current time.

note : A text string up to 32,000 bytes long. New lines should be sent as \n.

meta : A text string up to 1024 bytes long for storing metadata about the task. This is useful for syncing data that cannot otherwise be synced to Toodledo. This data is unique per task ID. This data is private to your App ID. Neither the user, nor other App IDs can see the data that you put in here. Because of an implementation detail, using the meta field introduces extra latency to each API call, so you should only use this field when necessary.

previous : If the task was repeated from another task, this will contain the id number of the previous version of this task.

shared : A boolean (0 or 1) that indicates if the task is shared as a joint task (Subscription required for user). Read only.

sharedowner : The user id of the person who owns the task that is being shared with the current user. If the current user is not the owner, then they cannot make changes to the collaboration settings for this task, although they can make other changes. Read only.

sharedwith : An array of user ids for people that this task is shared with, other than myself and the owner. Read only.

addedby : The user id of the collaborator who assigned the task (Subscription required for user).

via : A read-only field that indicates how the task was added. These are the possible values:

0: Main website

1: Email Import

2: Firefox Addon

3: This API

4: Widgets (Google Gadget, etc)

5: Not used

6: Mobile Phone

7: iPhone App

8: Import Tools

9: Twitter

attachment : An array of attachment items. Each item will contain the following three fields. Attachments are currently read only. You can use the id number to reference the outline, list or note that you can get via this API. File's are not currently readable, but we plan to add this functionality soon.

id: The unique id number for the attachment

kind: The kind of attachment (file,note,outline,list)

name: The display name of the attachment

Retrieving Tasks

The "tasks/get.php" API call will return a list of the tasks that match your search parameters. You can access this via GET or POST. The following search parameters may be used to limit the returned tasks. To make sync go as efficiently as possible you should request the minimum amount of data that you need. Usually, this means keeping track of the "lastedit_task" field from the account/get.php API call and using this in combination with the "after" field in this call to request only those tasks that have changed since your last sync.

before : A GMT unix timestamp. Used to find tasks with a modified date and time before this date and time.

after : A GMT unix timestamp. Used to find tasks with a modified date and time after this date and time.

comp : Boolean (0 or 1). Set to 0 to find only uncompleted tasks. Set to 1 to find only completed tasks. Omit variable, or set to -1 to retrieve both completed and uncompleted tasks.

id : The id number of the task that you want to fetch. This is useful if you already know the id number and only need to fetch the one task.

start : The number of records that you want to skip before printing results. Use this in combination with "num" if you want to paginate your results. The default value is 0.

num : The number of records to go through until output is stopped. Use this in combination with "start" if you want to paginate your results. The default and max value is 1000.

fields : A comma separated list of optional fields that you want returned. For efficiency, you should omit fields that you don't use. This will make downloading, parsing and syncing go much faster.

Always returned (do not list in the fields paramater or you will get an error):id, title, modified, completed

Adding Tasks

You can add up to 50 tasks at a time by making a POST to the "tasks/add.php" API call with an array of tasks. For each task the title field is required, and the following fields are optional: folder, context, goal, location, priority, status,star, duration, remind, starttime, duetime, completed, duedatemod, repeat, tag, duedate, startdate, note, parent, meta (see above for possible values).

There is also a special field called "ref" that you can use to pass through an alphanumeric id number to aid in matching things up after a sync. The "ref" field is not saved into the task, it is only echoed back to you on this call.

Tasks are added by creating a JSON object (example below) and submitting a POST to the API. Please represent newline characters as \n. Be sure to encode the data properly for transfer via a URL (symbols replaced with their %XX equivalent and spaces encoded as +). Each element in the array will be a task object. You only need to set the fields that you want to set. For efficiency, you should try to send only the fields that you are setting.

If the action was successful the added tasks will be returned in the same order in which they were added. If there were any errors on individual tasks, they will be output inline with the returned tasks, so you can determine which action failed.

[{"id":1234,"title":"My Task","modified":1281990824,"completed":0,"folder":0,"star":0},
{"id":1235,"title":"Another","modified":1280877483,"completed":0,"folder":0,"star":1,"ref":"98765"},
{"errorCode":601,"errorDesc":"Your task must have a title","ref":"1234"}]

You can also specify xml as the output format for any API calls by attaching "f=xml" to the URL.

Editing Tasks

You can edit up to 50 tasks at a time by making a POST to the "tasks/edit.php" API call. For each task, the id field is required, and the following fields are optional: title, folder, context, goal, location, priority, status,star, duration, remind, starttime, duetime, completed, duedatemod, repeat, tag, duedate, startdate, note, parent, meta (see above for possible values).

Additionally, you can set the "reschedule" variable to "1" if you want Toodledo to automatically reschedule the repeating task for you. This will only apply if you also set the completion date, and if the task has a due-date and repeating value. If you do not set this, then you are responsible for rescheduling repeating tasks yourself, as well as properly handling any subtasks that the task may have. It is recommended that you allow Toodledo to reschedule repeating tasks for you.

Tasks are added by creating a JSON object (example below) and submitting a POST to the API. Be sure to encode the data properly for transfer via a URL (symbols replaced with their %XX equivalent and spaces encoded as +). Please represent newline characters as \n. Each element in the array will be a task object. You only need to set the fields that you want to set. For efficiency, you should try to send only the fields that have changed.

If the action was successful the edit tasks will be returned. If there were any errors on individual tasks, they will be output inline with the returned tasks, so you can determine which action failed.

Deleting Tasks

The "/tasks/delete.php" API call will allow you to permanently delete up to 50 tasks at a time. You can access this via POST. For tasks that the user wants available in the history section, or for tasks that continue to repeat, you should not use this method. Instead, you should edit the task and mark it as completed.

Tasks are deleted by submitting a JSON encoded array of id numbers to the API.

If the action was successful the deleted tasks's id numbers will be returned. If there were any errors on individual tasks, they will be output inline with the returned tasks, so you can determine which action failed.

Error Codes

Any of the API calls can return error messages. Here is a list of the error messages that you may receive from the tasks API endpoints. If there was an error when editing or deleting a task, the id number that you attempted to edit will be included in the error's "ref" field for your reference.

601 : Your task must have a title.

602 : Only 50 tasks can be added/edited/deleted at a time.

603 : The maximum number of tasks allowed per account (20000) has been reached

604 : Empty id

605 : Invalid task

606 : Nothing was added/edited. You'll get this error if you attempt to edit a task but don't pass any parameters to edit.

607 : Invalid folder id

608 : Invalid context id

609 : Invalid goal id

610 : Invalid location id

611 : Malformed request

612 : Invalid parent id

613 : Incorrect field parameters

614 : Parent was deleted

615 : Invalid collaborator

616 : Unable to reassign or share task

Examples:

JSON:
{"errorCode":601,"errorDesc":"Your task must have a name","ref":1234}