The sync token used with our events endpoint is basically a cursor or checkpoint. When you fetch all of the events with the same cursor, it should give you back the same thing plus any new events (i.e. if your cursor is
abcdef1234567890 and you got it at 1:00 PM, every time you pass
abcdef1234567890 in the request you should get all of the events since 1:00 PM until the current time - the time of the request). Note that making a request to the events endpoint will pass back a new cursor that represents “now” (the time the request was made), so if you make a subsequent request with the new cursor, you will only get the events that happened since that time.
Our events are intended to be used for something close to real-time updates, and using them once per day is stretching things a bit; they do expire after a short while. They are also only a best-effort resource for real-time sync and sometimes (particularly if Asana is having an issue) they can end up getting lost.
If you have a paid Asana organization or team, however, you can use our search API to more reliably get exactly what you’re looking for with the
modified_at.after filters. Note that our search API doesn’t support pagination in quite the same way as our other API endpoints, but there is a workaround described in that document for using the creation time of the task to get the effect of being able to paginate through the results. I’d recommend this approach for getting all task modifications that have happened across an entire organization, as it’s much faster and more efficient than requesting updates for every project.